Наследование с помощью Lo-Dash

Я пытаюсь эмулировать наследование в javascript, используя библиотеку JavaScript Lo-Dash.

Я просто использую _.extend для этого:

function Parent() {
 var self = this;
 self.hello = function () {
 console.log('Hello from parent');
 };
}
function Child() {
 var self = this;
 _.extend(self, Parent);
}
Child.hello(); // Doesn't exist

Я думал, что это сработает, поскольку все функции javascript являются объектами, но, очевидно, я ошибаюсь. Почему это не работает и как я правильно эмулирую наследование с помощью Lo-Dash?

3 ответа

Родитель - это просто конструктор класса Parent, он сам не обладает свойством hello, которое он добавляет к self. Вы можете просто изменить строку _.extend на это: _.extend(self, new Parent()), чтобы решить эту проблему. Это работает, потому что объект, возвращаемый new Parent(), имеет свойство hello, которое _.extend может скопировать на self.

Чтобы получить доступ к свойству hello, вам также потребуется создать экземпляр класса Child вместо доступа к hello в конструкторе. После выполнения вышеуказанного изменения (new Child()).hello() должен работать, потому что вы получаете доступ к свойству hello в экземпляре Child не к конструктору.

Но это кажется мне плохим решением, потому что new Child() instanceof Parent вернет false. Если вы хотите правильно настроить цепочку прототипов, чтобы происходило "истинное" наследование, вы должны прочитать о псевдеоклассическом и прототипном наследовании.


См. документацию _.create для рабочего примера.


Вы можете использовать _.create() и prototype для эмуляции наследования.

function Parent() {}
Parent.prototype.hello = function() {
 console.log('Hello from parent');
};
function Child() {}
Child.prototype = _.create(Parent.prototype, {
 'constructor': Child
});
var child = new Child();
child.hello(); //Hello from parent

licensed under cc by-sa 3.0 with attribution.