考虑以下简短代码:
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浏览器显示的内容来看,显然obj2的第一个 proto 是obj1。这也是合乎逻辑的。怎么会这样呢?
obj2.__proto__.isPrototypeOf(obj2) // true
此外,这是怎么回事:
obj2.__proto__.__proto__.isPrototypeOf(obj1) // true
还有另一件事。如果JS中的普通对象没有原型属性(但是内部原型插槽无法访问),为什么.isPrototypeOf(obj2)未被定义?因为如果您这样做obj2.prototype,您就会得到。
我用Google搜索和搜索,但无济于事。
答案 0 :(得分:2)
这样做的时候
let obj1 = {
name: "obj1",
}
const obj2 = Object.create(obj1);
您正在使用以下原型链创建一个obj2
:
Object.prototype -> obj1 -> obj2
(Object.protoype
和obj1
都在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);