Child.prototype = new Parent;
создает нового Родителя без каких-либо параметров и возвращает его прототип, присваивая его Child.prototype
. Этот подход работает хорошо, но проблема в том, что он работает только с родителями с 0 параметрами (new Parent
является эквивалентом new Parent()
в этом контексте).
Для конструкторов Parent с параметрами я предлагаю определить функцию наследования для обработки вашего наследования.
Исправление, которое я предложил ранее, было исправлением Child.prototype = Parent.prototype;
. Это будет работать, но теперь Child.prototype
является ссылкой на Parent.prototype
, а не объектом. Другими словами, если вы добавите метод hello к Child, то Parent также получит этот метод. Плохие времена!
Лучшее решение этой проблемы - определить функцию inherits
следующим образом:
function inherit(parentPrototype) {
function F() {};
F.prototype = parentPrototype;
return new F;
}
То, что мы здесь делаем, немного отличается от простого назначения Parent.prototype
Ребенку. Мы создаем новую функцию с прототипом родителя и возвращаем новый экземпляр функции F. Итак, когда вы добавляете методы в Child, вы фактически добавляете их в прототип F
функция.
Чтобы создать объект Child сейчас, вы должны сделать:
function Child() {};
Child.prototype = inherit(Parent.prototype); // returns an instance of F
Затем вы можете добавлять методы к Ребенку, не затрагивая Родителя.