【发布时间】:2020-04-16 22:28:47
【问题描述】:
如果我们假设这句话是真的:“prototype 是用于构建__proto__ 的对象”,那么 Object.create 是如何工作的?如果你这样做:
let obj1 = {
name: "obj1",
}
const obj2 = Object.create(obj1);
当ob1.prototype 是undefined 时Object.create() 应该如何从ob1.prototype 创建obj2.__proto__??
也许Object.create() 使用了不同于构造函数或工厂函数的另一种创建原型继承的方法??
因为,在上面的 Object.create() 示例中,这是正确的:
console.log(obj2.__proto__ === obj1);
但是如果我们用构造函数做同样的事情,这将是真的:
console.log(obj2.__proto__ === obj1.prototype);
用函数构造对象:
function obj1(name) {
this.name = name;
}
const obj2 = new obj1();
我错过了什么吗?
【问题讨论】:
-
我同意这是一个故意混淆的名称选择,但
.prototype属性仅存在于 function 对象上,唯一相关的是new F()创建的对象具有他们的“实际”原型(__proto__属性)设置为F.prototype。但是当你做obj2 = Object.create(obj1)时,那么obj1没有.prototype(除非它是一个函数),而obj3.__proto__直接设置为obj1。这实际上是对 JS 原型机制的更明智的使用,而不是“构造函数”的间接使用。 -
谢谢 Robin Zigmond,我以为会发生这样的事情,但我不确定。
标签: javascript object inheritance ecmascript-6 prototype