为什么函数响应.prototype而常规对象不响应?

时间:2016-01-10 19:36:39

标签: javascript prototype undefined new-operator prototypal-inheritance

考虑:

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确实有效?

2 个答案:

答案 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章主要关注这个主题。