从构造函数中继承DRY JavaScript

时间:2016-07-02 17:52:52

标签: javascript inheritance design-patterns

是否可以让DogCat继承Animal(不使用classextends关键字),而无需编辑代码已经编写了,并且同时将所有新代码保留在当前构造函数中

function Animal() {
  this.sleep = function() {
    var hoursSleepPerNight = this.hoursSleepPerNight;
    console.log( "z".repeat(hoursSleepPerNight) );
  }
}

function Dog() {
  this.hoursSleepPerNight = 8;
}

function Cat() {
  this.hoursSleepPerNight = 7;
}

var dog = new Dog();
dog.sleep();
// "zzzzzzzz"

2 个答案:

答案 0 :(得分:2)

Javascript使用原型继承,因此您可以从Animal继承如下:

function Animal() {
  this.sleep = function() {
    console.log("z".repeat(this.hoursSleepPerNight));
  }
}

function Dog() {
  this.hoursSleepPerNight = 8;
}
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;

function Cat() {
  this.hoursSleepPerNight = 7;
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;

var dog = new Dog();
dog.sleep();

这是一个小提琴:https://jsfiddle.net/k0op9sb6/

如果出于某种原因你必须在构造函数中设置原型,看起来你可以使用Object.setPrototypeOf__proto__proto) - HOWEVER < / strong>这是普遍的 Not WOMMENDED

function Dog() {
  this.hoursSleepPerNight = 8;
  Object.setPrototypeOf(this, new Animal()); // this.__proto__ = new Animal();
}

答案 1 :(得分:2)

不,如果您正在寻找原型继承,那么将所有与继承相关的代码保留在构造函数中是不可能的(并且不明智)。