码迷,mamicode.com
首页 > Web开发 > 详细

js 中 new 与 Object.create()的区别

时间:2019-08-23 22:31:11      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:转变   执行   this   属性   call   str   create   函数   写法   

前言

在js中,创建对象有三种方式

  1. {} // 对象字面量
  2. new Object()
  3. Object.create()

1和2的区别很小,1不能传参,2可以传参。

new Object() 和Object.create() 区别就比较大了

1. new关键字

new 关键字做了几件事

  1. 创建一个新对象
  2. 将新对象的原型指向构造函数的原型
  3. 执行构造函数,绑定this
  4. 返回这个对象

比如创建一个Car对象,伪代码

// new Car()
var obj = new Object()
obj._proto_ = Car.prototype
// 执行构造函数, 绑定this
Car.call(obj)

我们注意到比较关键的地方是,它调用了Car对象的构造函数,并通过call将obj的this绑定到了Car对象上

这一步操作将Car对象上的属性,继承到了obj上

2. Object.create()

Object.create做了什么事情呢?

它同样是创建一个新对象,将新对象的原型关联到构造函数上

var f = function() { }
f.prototype = Car
return new f()

可以看出,在Object.create的内部,并没有去调用Car构造函数,而是调用了创建新对象的构造函数,因此Car上的属性不会继承到Object.create创建的实例中

3. 例子

比较鲜明的地方是在继承的时候

子类去继承父类的原型方法的时候,很多人会这样写

// 父类是People,子类是Male
Male.prototype = new People()

new确实能够继承,但是调用了父类的构造函数,把父类的属性也给继承到了原型上,但是我们仅仅只是想要父类的原型方法,所以这样写是存在副作用的

正确的写法应该是

Male.prototype = Object.create(People.prototype)

这种方式,不会调用父类的构造函数,而是生成新对象,将新对象与父类原型关联,然后new这个新对象返回

new 构造函数的方式转变了成 new 新对象的方式,这样就更加纯净,干脆

js 中 new 与 Object.create()的区别

标签:转变   执行   this   属性   call   str   create   函数   写法   

原文地址:https://www.cnblogs.com/zzzmj/p/11402793.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!