new和Object.create的区别
MDN上的描述
今天在看JS中类的继承时,发现这两个东西有点意思,之前一直没有用过Object.create()
。于是乎打开了MDN,查了一下。在MDN上给Object.create()
的描述是这样的:
-
Object.create()
方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。 -
语法:
Object.create(proto,[propertiesObject])
proto
:新创建对象的原型对象propertiesObject
:可选。需要传入一个对象,该对象的属性类型参照Object.defineProperties()
的第二个参数。如果该参数被指定且不为undefined
,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。- 返回一个新对象,带着指定的原型对象和属性。
二者的区别
- 在MDN上的例子中有这么一段:
function Constructor(){}
o = new Constructor();
// 上面的一句就相当于:
o = Object.create(Constructor.prototype);
// 当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码
- 这么看起来就很清晰了,使用
Object.create(proto)
创建一个对象,即是以proto
为原型对象创建一个新的对象。 - 它们的区别在于,如果
Constructor()
这个构造函数中有传值,则使用new关键字可以执行其中的逻辑,但是使用Object.create()
则不能执行。 - 也正因为
Object.create()
不能执行构造函数,它常被用于在ES5下实现类的继承。它不会让构造函数被执行两次,造成性能不必要的浪费。