1.通过对象字面量创建

var a = {};   //最简单最直接的方法,是第二种的简写方式

2.通过object构造函数创建

var a = new Object();  // 这行代码创建了Object引用类型的一个新实例,然后把实例保存在变量a中。
a.name = 'pingfan';
console.log(a);  // 此时打印出来的是{name: 'pingfan'}

3.通过Object.create(__proto__, propertiesObject)创建

var a = Object.create(null);  // 新创建出来的对象的原型指向null,也就是没有原型
console.log(a);  // {}

__proto__ 是必填参数,就是新创建出来的对象的原型。
propertiesObject是可选参数,作用就是给新对象添加新属性以及描述器。

4.通过工厂模式创建

实际上是把创建对象的方式放在了一个函数里面,然后通过这个函数返回出一个对象。代码如下:

function creatObject(name) {var a = new Object();a.name = name;a.sayName=function(){alert(this.name);};return a;
}
var b = creatObject('pingfan');
console.log(b instanceof creatObject);  // false 判断a的类型
// 用一个变量去接收函数返回的对象,var b = {name: 'pingfan', sayName:function(){ alert(this.name);}}
b.sayName();  // 调用b对象的sayName方法。
我们可以把creatObject函数看作是一个工厂在制造商品,而return出来的就是商品(对象),而这个b就是买商品的人,当我们买了一件商品的时候我们就可以去使用这件商品了

优点:可以重复调用creatObject函数,解决了创建多个相似对象的问题。
缺点:虽然它能创建多个相似的对象,但是不能识别这个对象属于哪个类型。

5.使用构造函数创建对象(Constructor)

对比工厂模式,它是工厂模式的进化版,因为它少了创建对象的步骤(实际上创建了,隐藏了),也没有return语句,代码如下:

function CreatObject(name) {  // 首字母要大写,标明这是一个构造函数this.name = name;this.sayName = function() {console.log(this.name);};}
var a = new CreatObject('pingfan');   // 使用new实例化构造函数
console.log(a)   // CreatObject {name: "pingfan", sayName: ƒ} f代表的函数 CreatObject代表的是对象类型
console.log(a instanceof Object);  // true 解决了工厂模式不能判断类型的问题
console.log(a instanceof CreatObject); // true
console.log(a.constructor == CreatObject); //true

优点:
可以重复new实例化构造函数,解决了工厂模式不能判断类型的问题
可以将构造函数的实例标识为某种特定的类型
采用new操作符调用构造函数
函数中隐式地创建对象
将属性和方法复制给了this对象
没有return语句
缺点:
实例对象都可以继承构造器函数中的属性和方法。但是,同一个对象实例之间,无法共享属性
构造函数中的每个方法都要在实例上重新创建一遍,封装性不好,原因如下:

var b = new CreatObject('xiaoran');
console.log(a.name);  // pingfan
console.log(b.name);  // xiaoran
console.log(a.sayName === b.sayName );  //false !!!!注意这里

由上可见a.sayName !== b.sayName,也就意味着每一次实例都要创建一遍,怎么办呢,继续优化呗。

6.使用原型模式(propotype)

因为构造函数创建对象也有缺点怎么办呢?这时候原型就蹦了出来,解决了构造函数的缺点。每个数据类型都是对象(undefined和null除外),而每个对象都是继承自一个原型对象,只有null除外,它没有自己的原型对象,最终的Object的原型为null,涉及到原型链知识点。代码如下:

function CreatObject() {  // 首字母要大写,标明这是一个构造函数
}
CreatObject.prototype.name = 'pingfan';
CreatObject.prototype.sayName = function() {alert(this.name);
};
var a = new CreatObject();   // 使用new实例化构造函数
var b = new CreatObject();
console.log(a.name); // a   pingfan
console.log(b.name); // b   pingfan
console.log(b.propotype.constructor); // CreatObject()
console.log(a.sayName === b.sayName);  // true   a和b都可以公用sayName方法

propotype是构造函数CreatObject的属性,而consructor则是构造函数的prototype的属性它所指向的是CreatObject构造函数
重写CreatObject.prototype对象会造成propotype.constructor属性不会指向CreatObject构造函数,实例对象拥有一个[[prototype]]指针,指向的是最初的原型对象,如果重写了原型对象,就相当于切断了构造函数和最初原型对象之间的联系

function CreatObject() {  // 首字母要大写,标明这是一个构造函数
}
CreatObject.prototype = {name: 'pingfan',love: ['lol','98k'],sayName: function() {alert(this.name);}
}
var a = new CreatObject();   // 使用new实例化构造函数
var b = new CreatObject();
a.love.push('you')
console.log(a.love); // a   lol,98k,you
console.log(b.love); // b   lol,98k,you
console.log(a.sayName === b.sayName);  // true   a和b都可以公用sayName方法
console.log(b.propotype.constructor); // undefined

优点:
方法不会重新创建。共享原型对象上的方法
缺点:
不能初始化参数。共享原型对象上的属性(比如属性的值是一个数组,当使用push方法添加元素的时候原数组被改变了)

7.组合模式

构造函数模式与原型模式的一起来,代码如下:

function CreatObject(name) {this.name = name;
}
CreatObject.prototype = {constructor: CreatObject,getName: function () {console.log(this.name);}
};
var a = new CreatObject('pingfan');
var b = new CreatObject('xiaoran');
console.log(a);  // CreatObject {name: "pingfan"}
a.getName();  // pingfan
b.getName();  // xiaoran
console.log(a.getName === b.getName);  // true

优点:
以上问题都解决,该公用的公用,私用的私用
缺点:
封装性不是很好,

8.寄生构造函数模式

写法跟工厂模式和构造函数模式很像,构造函数的头,工厂模式的身体,构造函数的实例,推荐特殊情况下使用

function Person(name) {var o = new Object();o.name = name;o.getName = function () {console.log(this.name);};return o;
}var person1 = new Person('pingfan');
console.log(person1 instanceof Person) // false
console.log(person1 instanceof Object) // true

9.稳妥构造函数模式

没有公共属性,而且其方法也不引用 this 的对象。新创建的实例方法不引用 this,也不使用 new 操作符调用构造函数

function person(name){var o = new Object();o.getName = function(){console.log(name);};return o;
}var person1 = person('kevin');
person1.getName(); // kevin
person1.name = "daisy";
person1.getName(); // kevin
console.log(person1.name); // daisy

--------------------------------------------------------------------------------------(完)-------------------------------------------------------------------------

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

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

    在 js 中可以通过 Object 构造函数或对象字面量来创建对象,但是这些方式在创建具有同样接口的多个对象需要重复编写很多代码. 因此,便有了几种常见的创建对象的模式,它们分别有着各自的优缺点,可以 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Javascript创建对象的几种方式?

    javascript 中常见的创建对象的几种方式: 1. 使用Object构造函数创建: 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性 ...

最新文章

  1. VS201“.NET研究”0实践RUP4+1架构模型
  2. 【干货】”首个“ .NET Core 验证码组件
  3. 学习vi和vim编辑器(8):全局替换(1)
  4. 请问:如何实现文件日志功能?要求每天换一个文件。文件名以日期区分
  5. Taro+react开发(70):flex布局
  6. 简单的cpu飙升排查方法
  7. 编程建立一通讯簿C语言,C语言编程问题用C语言编个学生通讯录管理系统,功能有:①创建通讯 爱问知识人...
  8. 大数据学习笔记:初探大数据世界
  9. 安卓学习笔记43:初试开源框架Volley
  10. Spark常用算子讲解二
  11. android for opencv (2) byte[] ,Bitmap 与 Mat 类型转换,Bitmap保存照片
  12. java 结束循环_java如何终止多层循环
  13. 计算机操作系统 (第四版汤小丹老师) 复习笔记完整版——第一章:操作系统引论
  14. 微服务架构 | 配置中心 - [Config]
  15. 云存储——115网盘
  16. 数据科学库(六)pandas中的时间序列
  17. slice(),splice(),split(),substring(),substr()使用方法和区别
  18. unity 构建迷宫_教程:使用GameDraw在Unity中构建迷宫游戏关卡
  19. 《视觉SLAM十四讲》读书笔记(二)
  20. Docker 入坑指南

热门文章

  1. 中国外文局文化传播中心借力vLive虚拟直播,打造国际汉文化云讲堂
  2. 百度网盘搜索工具_2019
  3. 毕业季,说一说自己从学生初入职场的感受
  4. pytorch实现特征图可视化,代码简洁,包教包会
  5. 爬虫实战_爬取静态单张图片
  6. 动手的乐趣_1969功率放大器
  7. 【论文笔记】Learning to Count in the Crowd from Limited Labeled Data
  8. Linux 【Linux下VI语法】
  9. fcpx插件:stupid raisins info pop for mac(27个信息和描述标题栏)
  10. 不联网计算机软件升级,不能联网的电脑如何升级病毒库