How could this be true??? obj2.__proto__.isPrototypeOf(obj2) //true

微笑、不失礼 提交于 2020-01-16 09:22:14

问题


Consider this short code:

let obj1 = {
  name: "obj1",
}

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

If you console.log(obj2), it will show this in Google Chrome (Version 79.0.3945.88 (Official Build) (64-bit)):

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

Or, you better check this console screenshot image:

From what Google Chrome presents, it is obvious that first proto of obj2 is obj1. It is logical too. How come then, that this is true:

obj2.__proto__.isPrototypeOf(obj2) // true

Also, how this is true:

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

And another thing. If ordinary object in JS, does not have prototype property (but internal prototype slot which is inaccessible), why .isPrototypeOf(obj2) is not undefined?? Because if you do obj2.prototype that's what you'll get.

I googled and googled this but to no avail.


回答1:


When you do

let obj1 = {
  name: "obj1",
}

const obj2 = Object.create(obj1);

You're creating an obj2 with the following prototype chain:

Object.prototype -> obj1 -> obj2

(Both Object.protoype and obj1 are within obj2's internal prototype chain)

When you reference the __proto__ property on an object, this will point you to the internal prototype of the current object. So, for example, obj2.__proto__ is obj1.

(Although .__proto__ is deprecated, it's not inaccessible)

So

obj2.__proto__.isPrototypeOf(obj2) // true

is equivalent to

obj1.isPrototypeOf(obj2) // true

And obj1 is indeed within obj2's internal prototype chain, so it evaluates to true.

Similarly, for

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

this is

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

Which makes sense as well - Object.prototype is indeed within obj1's prototype chain.

It's better to use the non-deprecated version Object.getPrototypeOf instead of __proto__, they do the same thing:

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

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


来源:https://stackoverflow.com/questions/59491618/how-could-this-be-true-obj2-proto-isprototypeofobj2-true

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!