是否可以让Dog
和Cat
继承Animal
(不使用class
或extends
关键字),而无需编辑代码已经编写了,并且同时将所有新代码保留在当前构造函数中?
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"
答案 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)
不,如果您正在寻找原型继承,那么将所有与继承相关的代码保留在构造函数中是不可能的(并且不明智)。