之前已经回答过,但我想证实我的理解。在这段代码中:
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
只能在定义之后调用。除此之外,没有区别吗?
答案 0 :(得分:7)
两种方法(使用case
和构造函数调用)之间的差异是:
创作:
break
创建一个新对象,使Object.create()
成为原型; Object.create(somePrototype)
使用构造函数调用创建对象。 somePrototype
的原型是一个简单的对象:new someConstructor()
属性继承:
obj2
继承属性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
未与对象文字一起提升,因此应在设置值后使用。检查this interesting post关于someConstructor
属性。
答案 1 :(得分:6)
Object.create()
调用会创建一个对象并为其提供您请求的原型。 new
调用会创建一个由该构造函数直接修饰的对象。
不同之处在于构造函数创建的对象具有自己的属性,其值为console.log()
的函数。 Object.create()
调用会创建一个从原型对象继承类似函数的对象。
如果您将第一个对象传递给Object.keys()
,您将无法看到&#34;说&#34;属性;如果你传递了第二个对象,你会的。