javascript - 为什么这个属性没有为函数类定义,而是为相同的实例定义?

标签 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 的原型(prototype)中,一旦在对象的实例中找不到它,解释器不应该在那里找到它吗?

最佳答案

.prototype 属性有点令人困惑。它不引用当前对象的内部原型(prototype) - 相反,当函数具有 prototype 属性时,实例将具有 .prototype 对象的内部原型(prototype)函数。

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

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

因此,当解释器试图查找 doSomething 上的 foo 属性时,它既不存在于它也不存在于 doSomething< 上的任何对象上内部原型(prototype)链,因此 doSomething.foo 的计算结果为 undefined

(可以使用 __proto__(已弃用)或 Object.getPrototypeOf 访问对象的内部原型(prototype)。这听起来很相似,但非常不同 来自函数的 .prototype 属性,它只是从该函数实例化的对象的内部原型(prototype)。)

foo 属性仅在 doSomething.prototype 属性上,而不在 doSomething 本身上,也不在任何 doSomething 的原型(prototype)祖先对象上。

关于javascript - 为什么这个属性没有为函数类定义,而是为相同的实例定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57454505/

相关文章:

javascript - JS 按类更改 setposition

javascript - 为什么我不能使用 JavaScript(而不是 HttpOnly)使 cookie 过期

javascript - jQuery Mobile 引号内引号内引号

javascript - 当我使用javascript在表单中输入错误的类型信息时,如何停止表单提交?

javascript - 启用/禁用 Gridview 中的文本框

javascript - 使用 javascript 选择复选框时隐藏表单元素

javascript - 使用变量从数组中获取数据

javascript - Phaser 3 循环依赖问题

javascript - JavaScript/Chrome 如何在本地执行跨域请求?

javascript - 检查网站是否可访问 JQuery/Javascript