一.创建对象的常见方法

(1)Object构造函数创建单个对象,早期的JavaScript开发人员经常使用该模式创建新对象。

 1 var person=new Object();
 2 person.name="xiaoming";
 3 person.age=16;
 4 person.job="Software Engineer";
 5
 6 person.sayname=function(){
 7     console.log(this.name);
 8 }
 9
10 person.sayname();//xiaoming

(2)使用对象字面量的方法创建单个对象,后来该方法成为创建这种对象的首选方法

 1 var person={
 2     name:"xiaoming",
 3     age:16,
 4     job:"Software Engineer",
 5     sayname:function(){
 6         console.log(this.name);
 7     }
 8 }
 9
10 person.sayname();//xiaoming

#思考#

  使用以上两种方法都可以创建单个对象,但是这些方式的不足是:使用同一接口创建很多对象,会产生大量的重复代码。

eg:当我们需要创建三个person实例时(使用字面量的形式创建)

 1    var person1={
 2     name:"xiaoming1",
 3     age:16,
 4     job:"Software Engineer",
 5     sayname:function(){
 6         console.log(this.name);
 7         }
 8     }
 9
10     var person2={
11     name:"xiaoming2",
12     age:16,
13     job:"Software Engineer",
14     sayname:function(){
15         console.log(this.name);
16         }
17     }
18
19     var person3={
20     name:"xiaoming3",
21     age:16,
22     job:"Software Engineer",
23     sayname:function(){
24         console.log(this.name);
25         }
26     }
27
28     person1.sayname();//xiaoming1
29     person2.sayname();//xiaoming2
30     person3.sayname();//xiaoming3

#思考#

  为了解决这一问题,人们开始使用工厂模式的一种变体。开发人员开发了一种函数,用函数来封装以特定接口创建对象的细节。

 1 function createPerson(name,age,job){
 2         var o=new Object();
 3         o.name=name;
 4         o.age=age;
 5         o.job=job;
 6         o.sayname=function(){
 7             console.log(this.name);
 8         };
 9         return o;//注意这里返回对象o
10     }
11
12     var person1=createPerson("xiaoming1","16","Doctor");
13     var person2=createPerson("xiaoming2","18","Software Engineer");
14
15     person1.sayname();//xiaoming1
16     person2.sayname();//xiaoming2

#思考#

  可以看到,以上工厂模式的创建方法相比Object构造函数和字面量创建对象实例,确实少了很多重复的代码。可以无数次的调用createPerson()函数,每次调用都会返回一个新的对象。

  但是这种模式存在的不足是:没有解决对象识别的问题,即不知道一个对象的类型。(我的理解是:虽然可以创建很多对象,但是此类对象到底是哪种类型,我们是不知道的,如果有一个具体的对象名,代表的是此类对象,那就更好了!

  为了解决工厂模式的这种不足,构造函数模式出现了。

  通过创建自定义的构造函数,从而定义自定对象类型的属性和方法。

 1 function Person(name,age,job){
 2         this.name=name;
 3         this.age=age;
 4         this.job=job;
 5         this.sayname=function(){
 6             console.log(this.name);
 7         };
 8     }
 9
10     var person1=new Person("xiaoming1","16","Doctor");
11     var person2=new Person("xiaoming2","18","Software Engineer");
12
13     person1.sayname();//xiaoming1
14     person2.sayname();//xiaoming2

#思考#

  可以看到构造函数模式比工厂模式又简洁了许多,重要的是,我们创建了一个可识别的对象,就是Person对象,可以通过new一个Person对象来进行对象的实例化。

  对比Person和createPerson的不同是:  

  (1)没有显示的创建对象,在createPerson中有var o=new Object();

  (2)直接将属性和方法赋给了this对象。

  (3)没有return语句。

#注意#

  注意:这里的Person是大写的,因为构造函数始终都应该以大写字母开头。

#思考#

  以上这个例子中,person1和person2分别保存着Person的一个不同的实例,这两个对象都有一个constructor(构造函数)属性。

  对象的constructor属性最初是用来标识对象类型的。例如这里:Person1和Person2这两个对象实例都是Person这个对象类型,所以返回true。

1 console.log(person1.constructor===Person);//true
2 console.log(person2.constructor===Person);//true

eg:

 1 A construction function
 2     function MyObj(){
 3         this.number=1;
 4     }
 5
 6     var x=new String("Hi");
 7
 8     if(x.constructor==String){
 9         document.write("Object is a String"+"<br/>");
10
11     }
12
13     var y=new MyObj;
14     if(y.constructor==MyObj){
15         document.write("Object constructor is MyObj.")
16     }

#另:关于对象的constructor属性参见:https://msdn.microsoft.com/zh-cn/library/c1hcx253(v=vs.94).aspx

   检测对象类型:instanceof操作符。

1 console.log(person1 instanceof Object);//true
2 console.log(person2 instanceof Object);//true
3 console.log(person1 instanceof Person);//true
4 console.log(person2 instanceof Person);//true

#到目前为止,我们创建对象的方法经历看以下改变:

转载于:https://www.cnblogs.com/LinSL/p/7274622.html

JS_高程6.面向对象的程序设计(2)创建对象_1相关推荐

  1. JS面向对象的程序设计之创建对象_工厂模式,构造函数模式,原型模式-1

    前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下.如有纰漏或错误,会非常感谢您的指出.文中绝大部分内容引用自<Ja ...

  2. js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式

    ·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...

  3. js面向对象的程序设计 --- 中篇(创建对象) 之 工厂模式和 构造函数模式

    创建对象 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复代码. ·工厂模式 工厂模式是一种广为人知的设计模式,这种模式 ...

  4. JavaScript高级程序设计读书笔记(第6章面向对象的程序设计之创建对象)

    2019独角兽企业重金招聘Python工程师标准>>> 面向对象语言都有"类"的概念,而通过类可以创建任意多个具有相同属性和方法的对象. JS中没有"类 ...

  5. 【天赢金创】面向对象的程序设计之创建对象

    对象的定义:无序属性的集合,属性的值可以是基本值.对象或者函数. 每个对象都是基于一个应用类型创建的,这个引用类型可以是内置的(例如Object Array Math),也可以是用户自定义的. 基于O ...

  6. 面向对象的程序设计——理解对象

    面向对象的程序设计 ECMA-262 把对象定义为:无须属性的集合,其属性可以包含基本值.对象或者函数. 理解对象 var person = new Object(); //创建对象 person.n ...

  7. python基础----面向对象的程序设计(五个阶段、对小白的忠告、关于OOP常用术语)、类、对象...

    一.面向对象的软件开发有如下几个阶段                                              1.面向对象分析(object oriented analysis ,O ...

  8. python程序开发的各个阶段_python基础----面向对象的程序设计(五个阶段、对小白的忠告、关于OOP常用术语)、类、对象...

    抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现这种模型.抽象不仅包括这种模型的数据属性,还定义了这些数据的接口. 对某种抽象的实现就是对此数据 ...

  9. PHP面向对象的程序设计封装--php高级最详细教程

    PHP面向对象的程序设计 前言: PHP5正式版本的发布,标志着一个全新的PHP时代的到来.PHP5的最大特点是引入了面向对象的全部机制,并且保留了向下兼容性.程序员不必再编写缺乏功能性的类,并且能够 ...

最新文章

  1. R语言使用ggpubr包的ggarrange函数组合多张结论图(水平并排组合)
  2. 将cocos2dx项目从Visual Studio 迁移到 xcode
  3. c语言使用zlib实现文本字符的gzip压缩与gzip解压缩
  4. 从国内的源使用pip安装库,提高安装速度
  5. Spring框架整合JUnit单元测试
  6. 偶然发现一个大佬写的 React 脚手架,叫Moderate, 用起来很方便
  7. keepalived的安装与添加服务
  8. Oracle中Sequence序列的使用
  9. qsocket 指定网卡_QSocket
  10. 数据结构排序系列详解之二 希尔排序
  11. linux内存管理_Linux内存管理(转)
  12. PDF有编辑密码怎么办?该怎么去除
  13. 使用深度学习打造智能聊天机器人
  14. jquery datatable 前端分页和后端分页例子
  15. html 文字竖着排引号,文字竖排演示
  16. 将自己的主页地址设置为OpenID
  17. Android自定义View之绘制圆形头像
  18. excel表格如何转换成word表格_还不会转换格式?教你一招,Excel表格完美转换成Word文档...
  19. 如何远程办公电脑 关于电脑远程办公的方法和工具分享
  20. 5G常见缩略语大全(一)

热门文章

  1. 三十四、动态规划解决01背包问题
  2. 【统计学习方法】K近邻对鸢尾花(iris)数据集进行多分类
  3. windows 10 anaconda python 3.7 安装keras-gpu tensorflow-gpu
  4. 打造自己的树莓派监控系统3--canvas.js绘制数据
  5. comsat java_java-com.thoughtworks.xstream.converters.ConversionExce...
  6. ssconvert 安装_在学ssm框架的时候,有点晕,会是会用了,但是一直搞不懂它的配置。该怎么深入理解?...
  7. oracle如何给表上锁,【ORACLE】Oracle中发生表加锁、死锁的原因,查看,与解决方法...
  8. mysql 1115_从ADS1115 Python向MySQL插入数据
  9. 工作流引擎 Activiti 实战系列
  10. 几大流行的NoSql的主要区别,你在用Redis、ElasticSearch还是MongoDB ?