一.创建对象的常见方法

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

 var person=new Object();
person.name="xiaoming";
person.age=16;
person.job="Software Engineer"; person.sayname=function(){
console.log(this.name);
} person.sayname();//xiaoming

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

 var person={
name:"xiaoming",
age:16,
job:"Software Engineer",
sayname:function(){
console.log(this.name);
}
} person.sayname();//xiaoming

#思考#

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

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

    var person1={
name:"xiaoming1",
age:16,
job:"Software Engineer",
sayname:function(){
console.log(this.name);
}
} var person2={
name:"xiaoming2",
age:16,
job:"Software Engineer",
sayname:function(){
console.log(this.name);
}
} var person3={
name:"xiaoming3",
age:16,
job:"Software Engineer",
sayname:function(){
console.log(this.name);
}
} person1.sayname();//xiaoming1
person2.sayname();//xiaoming2
person3.sayname();//xiaoming3

#思考#

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

 function createPerson(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayname=function(){
console.log(this.name);
};
return o;//注意这里返回对象o
} var person1=createPerson("xiaoming1","16","Doctor");
var person2=createPerson("xiaoming2","18","Software Engineer"); person1.sayname();//xiaoming1
person2.sayname();//xiaoming2

#思考#

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

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

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

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

 function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayname=function(){
console.log(this.name);
};
} var person1=new Person("xiaoming1","16","Doctor");
var person2=new Person("xiaoming2","18","Software Engineer"); person1.sayname();//xiaoming1
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。

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

eg:

 A construction function
function MyObj(){
this.number=1;
} var x=new String("Hi"); if(x.constructor==String){
document.write("Object is a String"+"<br/>"); } var y=new MyObj;
if(y.constructor==MyObj){
document.write("Object constructor is MyObj.")
}

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

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

 console.log(person1 instanceof Object);//true
console.log(person2 instanceof Object);//true
console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true

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

JS_高程6.面向对象的程序设计(2)创建对象_1的更多相关文章

  1. JS_高程6.面向对象的程序设计(2)创建对象_3 构造函数存在的问题

    # 上次讲到用构造函数的模式来创建对象,相对于工厂模式,解决可对象识别的问题. function Person(name,age,job){ this.name=name; this.age=age; ...

  2. JS_高程6.面向对象的程序设计(2)创建对象_2 构造函数也是一般函数

    1.构造函数也是一般函数,以下创建一个构造函数. var Person=function(name,age,job){ this.name=name; this.age=age; this.job=j ...

  3. JS_高程6.面向对象的程序设计(1)理解对象

    js的数据属性:P139(1)[[Configurable]](2)[[Enumerable]](3)[[Writable]](4)[[Value]] 使用Object.definerPropert( ...

  4. 重学js之JavaScript 面向对象的程序设计(创建对象)

    注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...

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

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

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

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

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

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

  8. JavaScript 面向对象的程序设计(一)之理解对象属性

    首先,JavaScript 面向对象的程序设计,主要分三部分. 理解对象属性: 理解并创建对象: 理解继承. 本文主要从第一方面来阐述: 理解对象属性 首先我们来理解Javascript对象是什么?在 ...

  9. JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承

    相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...

随机推荐

  1. Sqlserver2014 Master....提示异常,IIS未安装

    Q:使用Windos认证,登录失败,问题待解决补充 Q:打开Sqlserver2014  Master....提示异常,IIS未安装 解决方案: 安装iis配置,并全部勾选asp.net特性等 Tip ...

  2. 「BZOJ3791」作业

    题解: 比正解的做法要复杂 正解直接确定了最多有2k-1段 并且可以证明2k-1是一定可以覆盖的 于是可以直接dp 我的想法是先覆盖一段黑的,然后白的覆盖上去 所以f[i][0/1/2][0/1/2] ...

  3. MediatR

    1.MediatR是什么? 微软官方eshopOnContainer开源项目中使用到了该工具, mediatR 是一种中介工具,解耦了消息处理器和消息之间耦合的类库,支持跨平台 .net Standa ...

  4. jenkins(4): jenkins 插件

    1.  jenkins插件下载镜像加速 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-ce ...

  5. TopCoder SRM502 Div1 1000 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-1000.html SRM502 Div1 1000 题意 从 [0,n-1] 中选择 k 个不同的 ...

  6. 扩展中国剩余定理 (exCRT) 的证明与练习

    原文链接https://www.cnblogs.com/zhouzhendong/p/exCRT.html 扩展中国剩余定理 (exCRT) 的证明与练习 问题模型 给定同余方程组 $$\begin{ ...

  7. liunx系统虚拟机下安装tomcat9以及访问tomcat案例

    在liunx系统虚拟机下安装tomcat9 首先下载好压缩包 liunx系统环境的安装包 将其解压到虚拟机自己创建的目录下 解压命令   tar -zxvf   文件名 解压好如图所示 然后修改配置文 ...

  8. IDEA学习——模板及其常用模板

    模板及其常用模板 (1)psvm (2)sout sout / soutp / soutv / 变量.sout (3)fori iter增强for循环 itar普通for循环 (4)list.for ...

  9. C/C++中如何获取数组的长度(宏&模板)

    C.C++中没有提供 直接获取数组长度的函数.对于存放字符串的字符数组提供了一个strlen函数获取长度,那么对于其他类型的数组如何获取他们的长度呢?其中一种方法是使 用  sizeof(array) ...

  10. win 10 slmgr.vbs -xpr 无法运行,被豆麦笔记打开解决方法

    win 10 slmgr.vbs -xpr 无法运行,被豆麦笔记打开解决方法 删除这个豆麦笔记 如果之前已经在 控制面板 程序中卸载过,那么是找不到的,我们先运行 slmgr.vbs -xpr,这个时 ...