【问题标题】:How Object.create() should create obj2.__proto__ from ob1.prototype when ob1.prototype is undefined?当 ob1.prototype 未定义时,Object.create() 应该如何从 ob1.prototype 创建 obj2.__proto__?
【发布时间】:2020-04-16 22:28:47
【问题描述】:

如果我们假设这句话是真的:“prototype 是用于构建__proto__ 的对象”,那么 Object.create 是如何工作的?如果你这样做:

let obj1 = {
  name: "obj1",
}

const obj2 = Object.create(obj1);

ob1.prototypeundefinedObject.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


【解决方案1】:

您的句子“prototype 是用于构建__proto__ 的对象”仅适用于使用new 调用的functions。例如

  let dog = new Animal();

等于:

 let dog = Object.create(Animal.prototype); // <<<
 Animal.call(dog);

原型继承本身只是意味着对象包含对其原型的“内部”(__proto__)引用。使用Object.create 创建一个对象,其原型设置为传递的对象。因此

  let inherited = Object.create(obj)

相当等于

 let inherited = {};
  inherited.__proto__ = obj;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2016-01-08
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多