为什么对于函数类未定义此属性,但为同一类的实例定义了此属性?

时间:2019-08-12 00:14:12

标签: javascript

我正在看下面摘自MDN的示例:

function doSomething(){}
doSomething.prototype.foo = "bar";
var doSomeInstancing = new doSomething();
doSomeInstancing.prop = "some value";
console.log("doSomeInstancing.prop:      " + doSomeInstancing.prop);
console.log("doSomeInstancing.foo:       " + doSomeInstancing.foo);
console.log("doSomething.prop:           " + doSomething.prop);
console.log("doSomething.foo:            " + doSomething.foo);
console.log("doSomething.prototype.prop: " + doSomething.prototype.prop);
console.log("doSomething.prototype.foo:  " + doSomething.prototype.foo);

哪个会产生以下输出:

doSomeInstancing.prop:      some value
doSomeInstancing.foo:       bar
doSomething.prop:           undefined
doSomething.foo:            undefined
doSomething.prototype.prop: undefined
doSomething.prototype.foo:  bar

我不明白为什么doSomething.foo未定义。 foo被添加到doSomething的原型中,一旦在对象的实例中找不到它,解释器就不应在那里找到它吗?

1 个答案:

答案 0 :(得分:2)

.prototype属性有点令人困惑。它不涉及当前对象的内部原型-而是,当一个函数具有prototype属性时,实例将在该函数上具有.prototype对象的内部原型。

函数本身(此处为doSomething)不在doSomeInstancing的原型链上。这些是这里的原型链:

<- here means: "has an internal prototype of"

doSomething <- Function.prototype <- Object.prototype
doSomeInstancing <- doSomething.prototype <- Object.prototype

function doSomething(){}
const doSomeInstancing = new doSomething();

console.log(
  Object.getPrototypeOf(doSomething) === Function.prototype,
  Object.getPrototypeOf(doSomeInstancing) === doSomething.prototype,
  Object.getPrototypeOf(doSomething.prototype) === Object.prototype
);

因此,当解释器尝试在foo上查找doSomething属性时,该属性既不存在,也不存在于doSomething内部对象上的任何对象上原型链,因此doSomething.foo的评估结果为undefined

(可以使用__proto__(不推荐使用)或Object.getPrototypeOf访问对象的内部原型。这听起来与{{1 }}函数的属性,它只是从该函数实例化的对象的内部原型。)

.prototype属性仅位于foo的{​​{1}}属性上,而不位于.prototype本身上,也不位于doSomething的原型祖先中对象。