考虑我有一个功能
function xyz() {
console.log(xyz.say);
}
xyz.prototype.say = "Hello";
xyz();
打印
undefined.
但是当我说
时function xyz() {
console.log(xyz.prototype.say);
}
xyz.prototype.say = "Hello";
xyz();
打印
"Hello";
为什么会这样?是不是原型链试图在第一种情况下寻找财产?
答案 0 :(得分:4)
您将函数的原型属性与对象的内部原型混淆。
函数的原型属性用作通过使用函数作为构造函数创建的对象的原型。在您的示例中,xyz
的原型是Function.prototype,因为它是一个函数。但是,它的原型属性是一个使用say
属性扩展的对象。
以下是Eloquent Javascript解释差异的书的引用:
重要的是要注意原型与构造函数关联的方式(通过其
prototype
属性)与对象具有原型的方式之间的区别(可以使用Object.getPrototypeOf
)。构造函数的实际原型是Function.prototype,因为构造函数是函数。它的prototype
属性将是通过它创建的实例的原型,但不是它的自己的原型。