为什么函数响应 .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 章正是关注这个主题。
考虑:
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 章正是关注这个主题。