之前已经回答过这个问题,但我想确认一下我的理解。在这段代码中:
var somePrototype = {
speak: function() {
console.log("I was made with a prototype");
}
}
function someConstructor() {
this.speak = function() {
console.log("I was made with a constructor");
}
}
var obj1 = Object.create(somePrototype);
var obj2 = new someConstructor();
obj1.speak();
obj2.speak();
他们基本上都在做同样的事情,对吗?唯一的区别是 function someConstructor()
被提升了,这意味着我可以在定义它之前调用它的新实例,如果需要的话,而 var somePrototype
只能是定义后调用。除此之外,没有什么区别吗?
最佳答案
两种方法(使用 Object.create()
和构造函数调用)之间的区别是:
创作:
Object.create(somePrototype)
创建一个新对象,使somePrototype
成为原型(prototype);new someConstructor()
使用构造函数调用创建一个对象。obj2
的原型(prototype)是一个简单的对象:new Object()
属性继承:
obj1
继承了属性speak
,这是一个函数。如果此属性在somePrototype
对象中更改,这将影响使用Object.create(somePrototype)
创建的继承它的任何对象。
Object.keys(obj1)
将返回[]
,因为该对象没有自己的属性。obj2
包含一个自己的属性speak
。在单个实例上修改此属性不会影响使用new someConstructor()
创建的任何其他实例。
Object.keys(obj2)
将返回['speak']
作为其列出的属性。
构造函数:
obj1.constructor === Object
为true
obj2.constructor === someConstructor
为true
提升:
someConstructor
被提升到它创建的范围的顶部。所以它可以在函数声明之前使用。- 并且确定
somePrototype
没有随对象文字一起提升,因此应该在设置值之后使用。
检查 this interesting post关于 constructor
属性。
关于JavaScript:构造函数与原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36491719/