我不明白以下行为:
var Foo = function () {};
var Bar = function () {};
Foo.prototype = Bar;
var foo = new Foo();
console.log(foo.prototype === Bar.prototype); // true, but why?
我在规格中找不到任何关于使用构造函数创建的对象上prototype
属性的默认值的信息。(我确实找到了规范的这一部分,其中提到,对于函数,prototype
属性默认为new Object()
,但没有提到使用构造函数创建的对象。)
所以,我的问题是双重的:
使用构造函数创建的对象的prototype
属性的默认值是什么?(它似乎是构造函数的prototype
属性的prototype
属性;例如,Foo.prototype.prototype
)
在规范中,它是如何解释这种行为的?
发布于 2013-07-24 11:17:41
使用构造函数创建的对象的
prototype
属性的默认值是什么?
undefined
,除非您正在构建的是一个函数。prototype
属性属于函数。如果实例对象的prortype链中没有函数对象(即instanceObj instanceof Function
是false
),则实例通常不会具有prototype
属性。
函数之所以具有prototype
属性,是因为有一天任何函数都可能被用作构造函数。构造函数的prototype
属性确定其构造的实例的[[Prototype]]
内部属性。
(它似乎是构造函数的
prototype
属性的prototype
属性;例如,Foo.prototype.prototype
)
您只看到行为,因为您已经将Foo.prototype
分配给函数Bar
。因此,当您尝试获取foo.prototype
时,解释器将查找foo
的原型链,并在函数Bar
上找到prototype
属性。
尤其是,foo.prototype === Bar.prototype
是真的,因为:
foo.prototype
,我们首先尝试将prototype
从foo
中删除。foo
没有prototype
属性。foo
的[[Prototype]]
在构造foo
时被设置为Foo.prototype
(请记住,Foo.prototype
是函数Bar
)。prototype
on Bar
。Bar.prototype
。将其用于foo.prototype
。Bar.prototype
等于Bar.prototype
。在规范中,它是如何解释这种行为的?
发布于 2013-07-24 11:11:23
构造对象的原型是构造函数的.prototype
属性引用的对象。
因为foo.__proto__ === Bar
,很明显是foo.__proto__.prototype = Bar.prototype
。
foo
对象没有.prototype
属性,它是在foo.__proto__
中查找和发现的,因为对象的原型是一个具有prototype属性的函数对象,这就是您遗漏的内容。
https://stackoverflow.com/questions/17842122
复制相似问题