为什么函数会响应 .prototype,而普通对象却不会?

4

请考虑:

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

x.constructor.prototype == Foo.prototype - dandavis
实际上,xFoo的原型不相同:Foo的原型是Function.prototype。你已经得到了很好的答案,一些关于“JavaScript原型链”的研究应该会帮助你。 - traktor
2个回答

4

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

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

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

这就相当于:

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

请注意,通常情况下:
Object.getPrototypeOf( Foo ) != Foo.prototype

最后一行似乎最有帮助,特别是Foo.protoype不是Foo的原型,而是使用Foo构造的对象的原型。我理解得对吗? - user2316560

0
长话短说:用于new的函数有prototype,对象实例没有。
我可能在准确性上失败了,但是prototype只适用于你可以称之为构造函数的函数,这些函数旨在通过new调用以创建实例。原型可以被视为生成实例的模板。
对于生成的对象来说,prototype不是一个属性。相反,构造函数的原型中的属性在创建的实例上作为属性可用。这意味着当您在实例上查找属性时,如果在实例上未定义该属性,JavaScript将开始检查原型链以查看是否在那里定义。
如果您想访问实例的原型,请使用Object.getPrototypeOf
JavaScript的语义可能会让人感到困惑。我强烈推荐阅读免费的Javascript Allongé,以便更全面地理解一些JavaScript的细节。第8章正是专注于这个主题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接