为什么当我记录一个函数时它只打印函数而不是完整的Function对象?

时间:2015-07-31 11:37:14

标签: javascript prototype

考虑我有一个功能

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";

为什么会这样?是不是原型链试图在第一种情况下寻找财产?

1 个答案:

答案 0 :(得分:4)

您将函数的原型属性与对象的内部原型混淆。

函数的原型属性用作通过使用函数作为构造函数创建的对象的原型。在您的示例中,xyz的原型是Function.prototype,因为它是一个函数。但是,它的原型属性是一个使用say属性扩展的对象。

以下是Eloquent Javascript解释差异的书的引用:

  

重要的是要注意原型与构造函数关联的方式(通过其prototype属性)与对象具有原型的方式之间的区别(可以使用Object.getPrototypeOf)。构造函数的实际原型是Function.prototype,因为构造函数是函数。它的prototype 属性将是通过它创建的实例的原型,但不是它的自己的原型。