这怎么可能是真的??? obj2 .__ proto __。isPrototypeOf(obj2)// true

时间:2019-12-26 17:37:05

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

考虑以下简短代码:

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

或者,您最好检查以下控制台屏幕截图图像:

Google Chrome console screenshot of obj2

从Google Chrome浏览器显示的内容来看,显然obj2的第一个 proto 是obj1。这也是合乎逻辑的。怎么会这样呢?

obj2.__proto__.isPrototypeOf(obj2) // true

此外,这是怎么回事:

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

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

我用Google搜索和搜索,但无济于事。

1 个答案:

答案 0 :(得分:2)

这样做的时候

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