构造函数中的干JavaScript继承

构造函数中的干JavaScript继承,javascript,inheritance,design-patterns,Javascript,Inheritance,Design Patterns,是否可以让Dog和Cat从Animal继承而不使用类或extends关键字,不编辑已编写的代码,同时将所有新代码保留在当前构造函数中 Javascript使用原型继承,因此您可以从动物继承,如下所示: function Animal() { this.sleep = function() { console.log("z".repeat(this.hoursSleepPerNight)); } } function Dog() { this.hoursSleepPerNig

是否可以让Dog和Cat从Animal继承而不使用类或extends关键字,不编辑已编写的代码,同时将所有新代码保留在当前构造函数中


Javascript使用原型继承,因此您可以从动物继承,如下所示:

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();
这是一把小提琴:

如果出于某种原因,您必须在构造函数函数中设置原型,那么您可能可以使用Object.setPrototypeOf或_uproto__;-但是,一般不建议这样做:


Javascript使用原型继承,因此您可以从动物继承,如下所示:

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();
这是一把小提琴:

如果出于某种原因,您必须在构造函数函数中设置原型,那么您可能可以使用Object.setPrototypeOf或_uproto__;-但是,一般不建议这样做:


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

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

Dog.prototype=Object.createAnimal.prototype,但请注意睡眠是自己的属性,它不会被继承。你可以试试Dog.prototype=new Animal,但要注意副作用。你为什么要这么做?@Bergi,我想JavaScript可以被迫像Python/Ruby那样工作。在我看来,在定义类自己的方法和属性之后添加继承也是不自然的。我认为一定有更好的方法。@Trajanson:看来你已经有了一个解决方案:class+extends,与Python中没有什么不同。另外,您通常会在执行继承后定义原型方法?Dog.prototype=Object.createAnimal.prototype,但请注意睡眠是自己的属性,它不会被继承。你可以试试Dog.prototype=new Animal,但要注意副作用。你为什么要这么做?@Bergi,我想JavaScript可以被迫像Python/Ruby那样工作。在我看来,在定义类自己的方法和属性之后添加继承也是不自然的。我认为一定有更好的方法。@Trajanson:看来你已经有了一个解决方案:class+extends,与Python中没有什么不同。另外,你通常会在继承之后定义原型方法?你有什么想法吗;无法在Dog构造函数内移动?设置此.prototype会将自己的属性prototype添加到实例中。这与设置Function.prototype不同。通过设置此选项,您似乎可以获得所需的行为。\ uu proto\ uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?这是我最初的困惑之一。Object.setPrototypeOfDog=Object.createAnimal.prototype;之后,构造函数不工作。Dog.prototype=Object.createAnimal.prototype;不工作=>类型错误:dog.sleep不是function@Trajanson你应该可以替换这个;使用Object.setPrototypeof this,新动物;以上更新。但是,如果希望您的子对象继承sleep方法,则使用Object.createAnimal.prototype设置原型将不起作用,因为它是自己的属性。处理这个问题的典型javascript方法是将睡眠函数移动到动物原型,然后让您的孩子按如下方式继承:Dog.prototype=Object.createAnimal.prototype;不在你的构造函数中。你有没有想过为什么这个.prototype=新动物;无法在Dog构造函数内移动?设置此.prototype会将自己的属性prototype添加到实例中。这与设置Function.prototype不同。通过设置此选项,您似乎可以获得所需的行为。\ uu proto\ uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?这是我最初的困惑之一。Object.setPrototypeOfDog=Object.createAnimal.prototype;之后,构造函数不工作。Dog.prototype=Object.createAnimal.prototype;不工作=>类型错误:dog.sleep不是function@Trajanson你应该可以替换这个;使用Object.setPrototypeof this,新动物;以上更新。但是,如果希望您的子对象继承sleep方法,则使用Object.createAnimal.prototype设置原型将不起作用,因为它是自己的属性。处理这个问题的典型javascript方法是将睡眠函数移动到动物原型,然后让您的孩子按如下方式继承:Dog.prototype=Object.createAnimal.prototype;不在构造函数中。
function Dog() {
  this.hoursSleepPerNight = 8;
  Object.setPrototypeOf(this, new Animal()); // this.__proto__ = new Animal();
}