【问题标题】:How could this be true??? obj2.__proto__.isPrototypeOf(obj2) //true这怎么可能是真的??? obj2.__proto__.isPrototypeOf(obj2) //true
【发布时间】:2019-12-26 17:37:05
【问题描述】:

考虑一下这个短代码:

let obj1 = {
  name: "obj1",
}

const obj2 = Object.create(obj1);
obj2.name = "obj2"

如果您使用 console.log(obj2),它会在 Google Chrome 中显示这个(版本 79.0.3945.88(官方构建)(64 位)):

{name: "obj2"}
    name: "obj2"
    __proto__:
        name: "obj1"
        __proto__:
            constructor: ƒ Object()

或者,您最好查看此控制台屏幕截图:

从谷歌浏览器的显示来看,很明显obj2的第一个proto就是obj1。这也是合乎逻辑的。那怎么会是真的:

obj2.__proto__.isPrototypeOf(obj2) // true

还有,这是怎么回事:

obj2.__proto__.__proto__.isPrototypeOf(obj1) // true

还有一件事。如果 JS 中的普通对象,没有原型属性(但内部原型槽是不可访问的),为什么 .isPrototypeOf(obj2) 不是未定义的?因为如果你做 obj2.prototype 这就是你会得到的。

我用谷歌搜索了这个,但无济于事。

【问题讨论】:

  • “第一个原型”是什么意思?至于谷歌没有帮助:the MDN documentationthe official spec
  • 其实我(现已删除)的回答是基于对您的误解的误解。 obj2.__proto__.isPrototypeOf(obj2)不是怎么可能是真的?你刚才问obj2的原型是不是obj2的原型。此外,obj2.__proto__ === obj1.
  • 同样(@Ry- 在第一个上是正确的),如果您记录两个对象并遵循第二个示例的逻辑,那么它应该很明显,因为它可以让您比较基础对象原型

标签: javascript object ecmascript-6 prototype prototypal-inheritance


【解决方案1】:

当你这样做时

let obj1 = {
  name: "obj1",
}

const obj2 = Object.create(obj1);

您正在使用以下原型链创建obj2

Object.prototype -> obj1 -> obj2

Object.protoypeobj1 都在obj2 的内部原型链中)

当您引用对象的__proto__ 属性时,这将指向当前对象的内部原型。因此,例如,obj2.__proto__obj1

(虽然.__proto__ 已弃用,但它不是不可访问)

所以

obj2.__proto__.isPrototypeOf(obj2) // true

等价于

obj1.isPrototypeOf(obj2) // true

obj1 确实在obj2 的内部原型链中,因此它的计算结果为true

同样,对于

obj2.__proto__.__proto__.isPrototypeOf(obj1) // true

这是

obj2.__proto__.__proto__.isPrototypeOf(obj1) // true
          obj1.__proto__.isPrototypeOf(obj1) // true          
        Object.prototype.isPrototypeOf(obj1) // true

这也是有道理的 - Object.prototype 确实在 obj1 的原型链中。

最好使用非弃用版本Object.getPrototypeOf 而不是__proto__,他们做同样的事情:

let obj1 = {
  name: "obj1",
};
const obj2 = Object.create(obj1);

console.log(obj2.__proto__ === obj1);
console.log(Object.getPrototypeOf(obj2) === obj1);

【讨论】:

  • 谢谢@CertainPerformance,现在我明白了。出于某种原因,我将 proto 与原型属性混合在一起。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2012-07-30
  • 2016-10-17
  • 2015-03-30
相关资源
最近更新 更多