在 js 中可以通过 Object 构造函数或对象字面量来创建对象,但是这些方式在创建具有同样接口的多个对象需要重复编写很多代码

因此,便有了几种常见的创建对象的模式,它们分别有着各自的优缺点,可以根据不同需求选择不同的模式。

工厂模式

function createPerson(name, age){// 创建一个对象let obj = new Object();// 把变量一一对应obj.name = name;obj.age = age;obj.sayName = function(){console.log(this.name);};// 返回创建好的对象return obj;
}let person = createPerson("ec50n9", 19);
console.log(person);
// { name: "ec50n9", age: 19 }

之所以叫工厂模式,是因为它的工作方式类似于流水线:

在调用 createPerson() 函数的时候,它就创建一个空的新对象(Object),按照预先定义的那样,把我们传进去的值一一装配到新对象上,然后把装配好的对象返回出来。

作用

只需调用一个函数就可以创建一个类似对象,避免了重复编写类似代码的情况。

不足

因为在函数内部,都是创建一个新的 Object 对象来装配的,所以创建出来的对象都是 Object 类型的,无法解决对象标识问题,也就是创建出来的新对象没有自己的类型。使用构造函数模式就可以解决这个问题了。

构造函数模式

function Person(name, age){this.name = name;this.age = age;this.sayName = function(){console.log(this.name);};
}let person = new Person("ec50n9", 19);
person.sayName();  // "ec50n9"

在这个例子中,Person() 构造函数代替了 createPerson() 工厂函数。实际上,Person() 函数内部的代码和 createPerson() 基本是一样的,只是有如下区别:

  • 没有显式创建对象。
  • 属性和方法直接复制给了 this
  • 没有 return

还要注意函数名 Person 的首字母大写了。按照惯例,所有构造函数的首字母都是要大写的,这类似于其他面向对象语言的类名一样。换句话说,构造函数的函数名就相当于一个类名了。

内部过程

在调用时也与普通函数有一些区别,就是在构造函数前面多了一个 new 操作符,以这种方式调用构造函数会执行如下操作:

  1. 在内存中创建一个新对象。
  2. 这个新对象内部的 [[prototype]] 特性被赋值为构造函数的 prototype 属性。
  3. 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。
  4. 执行构造函数内部的代码(给新对象添加属性)。
  5. 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

相比工厂模式,构造函数创建出来的对象有多了以下几个特性:

constructor 属性

构造函数创建出来的对象中会有一个 constructor 属性指向构造函数,可以通过判断某个对象的 constructor 是否等于某个构造函数来确定对象的类型。例如:

console.log(person.constructor);  // Person(name, age){....}console.log(person.constructor == Person);  // true

constructor 本来是用于标识对象类型的,不过,另一种使用 instanceof 操作符来确定对象类型的方式更可靠些

js 创建对象的几种方式相关推荐

  1. js创建对象的七种方式

    JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以创建单个对象,显然这两种方式会产生大量的重复代码,并不适合量产.接下来介绍七种非常经典的创建对象的方式,他们也 ...

  2. js创建对象的几种方式-转载

    1.工厂模式 弊端:没有解决对象的识别问题,即怎么知道一个对象的类型.  2.构造函数模式   与工厂模式相比:  1.没有显式的创建对象  2.直接将属性和方法赋给了this对象  3.没有retu ...

  3. js创建对象的几种方式(推荐)

    1.通过对象字面量创建 var a = {}; //最简单最直接的方法,是第二种的简写方式 2.通过object构造函数创建 var a = new Object(); // 这行代码创建了Objec ...

  4. js创建对象的几种方式

    1.通过new object方法或者字面量的方式创造对象 var obj = new Object() var obj1 = {} 缺点:创造多个key同,value不同的对象的时候会产生大量的重复代 ...

  5. JS 创建对象的七种方式

    1.工厂模式 function createPerson(name, job) {var o = new Object()o.name = nameo.job = jobo.sayName = fun ...

  6. JS 面向对象 ~ 创建对象的 9 种方式

    一.创建对象的几种方式 1.通过字面量创建 var obj = {};这种写法相当于:var obj = new Object(); 缺点:使用同一个接口创建很多单个对象,会产生大量重复代码 2.通过 ...

  7. 课程介绍 复习 创建对象的三种方式 自定义构造函数创建对象 工厂模式创建对象

    课程介绍 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8 ...

  8. 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  9. Java中创建对象的几种方式

    Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...

最新文章

  1. 初识C语言---(4)
  2. 学Linux的你还在为正则表达式而挠头?
  3. 如何初始化静态地图?
  4. quality center 支持的平台
  5. 2、FreeRTOS任务相关API函数
  6. 微软职位内部推荐-Principal Software Developer
  7. [转]浅析Tomcat、JBOSS、WebSphere、WebLogic、Apache
  8. OpenCV中的傅里叶的门道
  9. ASP.NET @Page指令属性
  10. 如何将枯燥的大数据呈现为可视化的图?
  11. 计算机网络交换机组网及虚拟局域网实验报告,计算机网络实验报告材料(虚拟局域网).doc...
  12. 不想再被鄙视?那就看进来! 一文搞懂Python2字符编码
  13. android逆向工程反编译指南(详细教程)
  14. 【C++沉思录】代理类
  15. 如何用CSDN-markdown编辑器写博客
  16. 深度网络自适应DCC算法
  17. 2018全国大学生电子竞赛D题代码和心得
  18. java对人物画像分级_用户画像,该怎么分析?
  19. iPhone6 6p 7 7p屏幕适配,切图准则
  20. Can't locate Time/HiRes.pm

热门文章

  1. 声卡麦克风实时采集并重采样
  2. 如何用ursina做游戏
  3. Java 计算两个日期之间相差多少工作日
  4. 离散数学 | 图论 | 欧拉图 | 哈密顿图 | 割点 | 桥(欧拉图和哈密顿图有没有割点和桥?)
  5. 手机视频制作怎么批量给视频消音
  6. 数据结构算法——1089. 路由器
  7. GIS系列(四)GeoServer的介绍和用法
  8. Disconf使用说明
  9. 程序员伪造一年工作经验_试火—如何伪造程序员
  10. Cadence内应该如何理解和使用balun做仿真。