【发布时间】: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 documentation和the official spec
-
其实我(现已删除)的回答是基于对您的误解的误解。
obj2.__proto__.isPrototypeOf(obj2)不是怎么可能是真的?你刚才问obj2的原型是不是obj2的原型。此外,obj2.__proto__ === obj1. -
同样(@Ry- 在第一个上是正确的),如果您记录两个对象并遵循第二个示例的逻辑,那么它应该很明显,因为它可以让您比较基础对象原型
标签: javascript object ecmascript-6 prototype prototypal-inheritance