Подтвердить что ты не робот

Наследование JavaScript с помощью _.extend()

В чем разница между

Employee.prototype = Object.create(Person.prototype);

и

_.extend(Employee.prototype, Person.prototype);

Оба дают аналогичные результаты (вывод), но метод подчеркивания, похоже, добавляет Person.prototype в Employee.constructor.prototype и, вполне возможно, требует дополнительного материала здесь и там, почему?

чистый JS

enter image description here

underscoreJS

enter image description here

Хороший побочный эффект _.extend заключается в том, что я могу легко выполнять множественное наследование: кажется, что он еще не делает цепочку прототипов длиннее...

_.extend(Employee.prototype, Person.prototype);
_.extend(Employee.prototype, {
    doSomething: function() {
        return "hi ...";
    }
});

Но...

enter image description here

Почему есть 2 sayHi и doSomething функционирует? (на самом деле это то же самое, когда я просто делаю 1).

http://jsfiddle.net/VMqSy/1/

4b9b3361

Ответ 1

С Employee.prototype = Object.create(Person.prototype); вы полностью заменяете Employee.prototype.

Но с _.extend(Employee.prototype, Person.prototype); вы добавляете Person.prototype поверх Employee.prototype.

Например,

var a = {var1:1, var2:2};
var b = {var2:4, var3:3};
console.log(_.extend(a, b)); // {var1:1, var2:4, var3:3}

Как вы видите, a он не полностью заменен на b, он просто расширен свойствами, определенными в b.