我正在看下面摘自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的原型中,一旦在对象的实例中找不到它,解释器就不应在那里找到它吗?
答案 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
的原型祖先中对象。