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

Why do functions respond to .prototype but regular objects do not?

考虑:

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 却起作用?

prototype 是一个 属性 的构造函数,它决定了由该构造函数创建的新对象的原型是什么。只有在构造函数上有这样的 属性 才有用。

只要构造函数的原型没有被改变:

Object.getPrototypeOf( x ) === Foo.prototype

这等同于:

Object.getPrototypeOf( x ) === x.constructor.prototype

注意一般:

Object.getPrototypeOf( Foo ) != Foo.prototype

长话短说:new 的函数有 prototype,对象实例没有。

我的表述可能不够精确,但是 prototype 仅适用于您可能称之为构造函数的内容,这些函数是用 new 调用的创建实例。可以将原型视为结果实例的模板。

对于生成的对象,prototype 而不是 属性。相反,属性 in 构造函数的原型可用作已创建实例的属性。这意味着当您在实例上查找 属性 时,如果它没有在实例上定义,Javascript 将开始检查原型链以查看它是否在那里定义。

如果要访问实例的原型,请使用Object.getPrototypeOf

Javascript 的语义可能令人困惑。我强烈建议通读 free-to-read Javascript Allongé,以此来彻底理解 Javascript 的一些要点。第 8 章正是关注这个主题。