【问题标题】:Object.create() useObject.create() 使用
【发布时间】:2018-12-11 19:11:50
【问题描述】:

我只是在学习原型继承,并且对Object的使用有点混淆.Create()。我对以下代码中为什么需要 Object.create() 感到困惑:

function Mammal (name){
  this.name = name;
  this.offspring = [];
}

Mammal.prototype.haveBaby = function (){
  var baby = new Mammal('Baby ' + this.name);
  this.offspring.push(baby);
  return baby;
}

function Cat (name, color){
  Mammal.call(this, name);
  this.color = color;
}

Cat.prototype = Object.create(Mammal.prototype);

#987654322 @未通过哺乳动物的方法?这就是为什么我们需要Object.create()

【问题讨论】:

  • 否,调用其他构造函数仅在该构造函数中运行初始化代码。它不影响原型链。首选Object.create() 来实现继承的技术原因相当复杂。足以说这样做那种方式是一个非常好的主意。 span>
  • 与您的问题无关,但您是否意识到您的猫对象会产生非猫的后代?

标签: javascript object inheritance prototype prototypal-inheritance


【解决方案1】:

Object.create 是在 v1.8.5 中作为alternative way 引入的,用于指定对象的原型。上述代码的实际区别在于它更简洁一些,因为在设置原型时不会冗余调用 Mammal 构造函数。

您可以使用以下语法在上述模式中获得相同的输出:

Cat.prototype = new Mammal();

但是这里new关键字会冗余调用构造函数,因为

Mammal.call(this, name);

然后再次显式调用Mammal,并将this 设置为Cat 实例。这样就在Cat 实例(不是原型)上设置了nameoffspring。这是classical inheritance example 的一种超级构造函数模式。

原型链使haveBaby() 可用于所有Cat 实例和所有Mammal 实例。唯一真正的区别是该链中的中间 Mammal 实例与空对象。

【讨论】:

  • 冗余?我会说不正确Object.create 不仅仅是一种选择,它是唯一正确的方法。
  • 这场辩论可能有助于澄清其含义...stackoverflow.com/a/12705137/1622684
  • @Bergi 不同意你的观点......那里的 cmets 包含大部分相关问题。我实际上并没有意识到这是一个激烈的争论点。
猜你喜欢
  • 2016-01-08
  • 2011-11-22
  • 2014-02-17
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2023-03-20
  • 2016-05-24
  • 1970-01-01
相关资源
最近更新 更多