2016-07-02 3 views
1

Можно ли получить Dog и Cat наследовать от Animal (без использования class или extends ключевых слов), без редактирования кода, который уже был написан, и , сохраняя при этом все новый код в функции текущего конструктора?DRY JavaScript Наследование от Внутри Конструктора

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

'Dog.prototype = Object.create (Animal.prototype)', но обратите внимание, что 'sleep' является собственным свойством, он не будет наследоваться. Вы можете попробовать «Dog.prototype = new Animal()», но имейте в виду побочные эффекты. – elclanrs

+0

Зачем вам это нужно? – Bergi

+0

@Bergi, желаемое за действительное, что JavaScript может заставить себя вести себя как Python/Ruby, я полагаю. – Trajanson

ответ

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 это универсальный у НЕ РЕКОМЕНДУЕТСЯ:

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

Любые мысли о том, почему 'this.prototype = new Animal();' не могут быть перемещены внутри конструктора Dog? – Trajanson

+1

Установка 'this.prototype' добавляет собственное свойство' prototype' в ваш экземпляр. Это не то же самое, что установка параметра Function.prototype. Похоже, вы можете получить поведение, которое вы ищете, установив 'this .__ proto__' (обновленный выше). – lucasjackson

+1

Используйте '' Object.create (Animal.prototype) 'вместо' new Animal' '(http://stackoverflow.com/a/17393153/1048572?Benefits-of-using-Object.create-for-inheritance) сделать это правильно и использовать 'Object.setPrototypeOf' вместо устаревшего' __proto__'. – Bergi

2

Нет, это не представляется возможным (и не имеет смысла), чтобы сохранить все наследование кода, связанного внутри конструктора, если вы ищете прототипе наследования.

Смежные вопросы