我不明白以下行为:
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 19: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。在规范中,它是如何解释这种行为的?
prototype属性用作其构造的对象的[[Prototype]]内部属性。[[Prototype]]等等)。发布于 2013-07-24 19:11:23
构造对象的原型是构造函数的.prototype属性引用的对象。
因为foo.__proto__ === Bar,很明显是foo.__proto__.prototype = Bar.prototype。
foo对象没有.prototype属性,它是在foo.__proto__中查找和发现的,因为对象的原型是一个具有prototype属性的函数对象,这就是您遗漏的内容。
https://stackoverflow.com/questions/17842122
复制相似问题