Doing Employee.prototype = Person.prototype, как говорят "Сотрудник Person", а не "Сотрудник является Личностью." Любые изменения в любом прототипе будут отражены в и классах.
Вот demonstration. Очевидно, мы не хотим, чтобы наши люди работали, потому что у них нет позиции.
Так правильно настроить прототип цепи без Object.create является:
Employee.prototype = new Person;
Но это требует создания экземпляра объекта, который является немного напуганным - особенно, если вы не хотите, конструктор человека к называться. Все экземпляры Employee собираются наследовать неопределенные свойства «firstName» и «lastName», независимо от того, хотите ли вы этого.
В этом случае это не имеет большого значения - конструктор Employee собирается установить те свойства на себе, которые будут заменять свойства, унаследованные от Person. Но рассмотрим this example. Можно подумать, что freeTime - это свойство уровня экземпляра для Person, которое не будет скопировано, потому что оно не на прототипе. Кроме того, мы никогда не вызывали конструктор Person из Employee. Не так - freeTime был установлен на прототипе Employee, потому что нам нужно было создать экземпляр объекта.
Таким образом, лучшее и самое чистое наследование, которое вы можете сделать, - через Object.create. Если вы хотите вызвать конструктор родительского класса, вы можете сделать это явно из конструктора подкласса. Еще одна приятная вещь: Object.create имеет второй (необязательный) аргумент defineProperties. Таким образом, вы можете также сделать это:
Employee.prototype = Object.create(Person.prototype, {
work: {
value: function() {
return this.fullName+" is doing some "+this.position+" stuff");
}
}
});
Конечно, если вы должны поддерживать устаревшие версии браузеров, вы не можете использовать Object.create. Альтернативой является использование клона/расширение из библиотек, таких как underscore или lodash. Или есть этот маленький танец:
var subclass = function() { };
subclass.prototype = Person.prototype;
Employee.prototype = new subclass;
Большой [ответ] (http://stackoverflow.com/questions/15040955/javascript-oop-and-prototypes-with-multiple-level-inheritance?answertab=active# tab-top) к этому с сегодняшнего дня. – marekful
wow. Спасибо за это. закладок для учебы! :-) –
[Нет] (http://stackoverflow.com/q/12500637/1048572) – Bergi