考虑:
function Foo() {}
var x = new Foo();
现在x和Foo有相同的原型,但只有Foo响应.prototype:
Object.getPrototype(x) === Foo.prototype // true
x.prototype === Foo.prototype // false
Foo.prototype // Foo {} (depending on which browser)
x.prototype // undefined
为什么x.prototype
不起作用,Foo.prototype
确实有效?
答案 0 :(得分:5)
prototype
是构造函数的一个属性,它确定该构造函数创建的新对象的原型是什么。只在构造函数上拥有这样的属性才有用。
只要构造函数上的原型没有被更改:
Object.getPrototypeOf( x ) === Foo.prototype
与...相同:
Object.getPrototypeOf( x ) === x.constructor.prototype
请注意:
Object.getPrototypeOf( Foo ) != Foo.prototype
答案 1 :(得分:1)
长话短说:用于new
的函数有prototype
,对象实例没有。
我可能会在说这个问题时失败,但是prototype
只适用于你可能称之为构造函数的东西,这些函数意味着用new
调用来创建实例。可以将原型视为结果实例的模板。
对于生成的对象,prototype
不是属性。相反, in 构造函数的原型中的属性可以作为创建的实例的属性使用。这意味着当你在实例上查找属性时,如果它没有在实例上定义,Javascript将开始检查原型链以查看它是否在那里定义。
如果要访问实例的原型,请使用Object.getPrototypeOf
。
Javascript的语义可能令人困惑。我强烈建议您通过免费阅读Javascript Allongé来彻底了解Javascript的一些细节。第8章主要关注这个主题。