5

似乎我终于理解了 JavaScript 继承以及它应该如何正确完成。这是我的代码:

function Human(eyes) {
    this.eyes = eyes ? "Not blind" : "Blind";
}
Human.prototype.canSee = function () {
    return this.eyes;
};
function Male(name, eyes) {
    Human.call(this, eyes);
    this.name = name;
}
Male.prototype = Object.create(Human.prototype);
var Sethen = new Male("Sethen", true);
console.log(Sethen.canSee()); //logs "Not blind"

据我了解,使用Object.create创建原型对象进行继承比使用new关键字好得多。这在我脑海中提出了几个问题。

  1. Male.prototype = Object.create(Human.prototype)原型链中会是Male.prototype --> Human.prototype --> Object.prototype --> null什么?
  2. MaleHuman.call(this, eyes);用来调用超类的构造函数中,我必须在构造函数中再次传递眼睛Male才能将其传递给Human构造函数。这似乎很痛苦,有没有更简单的方法可以做到这一点?
  3. 为什么有时我会看到这样的代码Male.prototype = new Human();......这似乎是不正确的。当我们这样做时实际发生了什么?
4

1 回答 1

3

要回答您的问题:

  1. 这是正确的。设置时,Male.prototype = Object.create(Human.prototype)您将原型链设置为Male.prototype --> Human.prototype --> Object.prototype --> null. 然后当你创建var Sethen = new Male实例时(Sethen)从这个原型链继承。
  2. 不,您需要手动将参数传递给基本构造函数。如果您想this.eyes = eyes ? "Not blind" : "Blind"Male函数本身内设置,但这只是代码重复。你在做什么是正确的。
  3. 那是旧的做事方式(在Object.create标准化之前)。我建议你不要使用它。在大多数情况下,它与新方法相同。但是,使用此方法您还会获得不需要的属性,例如eyeson Male.prototype

当我们这样做时,Male.prototype = new Human我们创建一个新实例Human并将其分配给Male.prototype. 因此原型链是Male.prototype --> Human.prototype --> Object.prototype --> null。然而,我们也得到了Male.prototype.eyes我们不需要的属性。那应该只属于 的实例Male

我建议你阅读我的博客文章。这是一个非常好的原型继承入门:Aadit M Shah | 为什么原型继承很重要

于 2013-07-18T18:11:22.230 回答