我不明白以下行为:
var Foo = function () {};
var Bar = function () {};
Foo.prototype = Bar;
var foo = new Foo();
console.log(foo.prototype === Bar.prototype); // true, but why?
我在the spec中找不到关于使用构造函数创建的对象上prototype
属性的默认值的任何内容。 (我确实发现this part of the spec提到,对于函数,prototype
属性默认为new Object()
,但没有提及使用构造函数创建的对象。)
所以,我的问题实际上是双重的:
使用构造函数创建的对象上prototype
属性的默认值是多少? (看起来它是构造函数的prototype
属性的prototype
属性;例如Foo.prototype.prototype
)
它在哪里解释了规范中的这种行为?
答案 0 :(得分:2)
构造对象的原型是构造函数的.prototype
属性引用的对象。
因为foo.__proto__ === Bar
,显然是foo.__proto__.prototype = Bar.prototype
。
foo
对象没有.prototype
属性,它在foo.__proto__
中查找并找到,因为对象的原型是一个具有原型属性的函数对象,这就是你错过的
答案 1 :(得分:2)
使用构造函数创建的对象上的
prototype
属性的默认值是什么?
undefined
,除非你正在构建的是一个函数。 prototype
属性属于函数。如果实例对象的prortype链中没有函数对象(即instanceObj instanceof Function
为false
),则该实例通常不具有prototype
属性。
函数具有prototype
属性的原因是因为任何函数有一天可能会被用作构造函数。构造函数的prototype
属性确定其构造实例的[[Prototype]]
内部属性。
(看起来它是构造函数的
prototype
属性的prototype
属性;例如Foo.prototype.prototype
)
您只能看到行为,因为您已将Foo.prototype
分配给函数Bar
。因此,当您尝试获取foo.prototype
时,解释程序会查找foo
的原型链,并在函数prototype
上找到Bar
属性。
特别是foo.prototype === Bar.prototype
是正确的,因为:
foo.prototype
,我们首先尝试从prototype
获取foo
。foo
没有prototype
属性。foo
[[Prototype]]
在构建Foo.prototype
时设置为foo
。 (请记住,Foo.prototype
是函数Bar
。)prototype
上查找Bar
。Bar.prototype
已定义。将其用于foo.prototype
。Bar.prototype
等于Bar.prototype
。它在哪里解释了规范中的这种行为?