Наследование 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/
Ответы
Ответ 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
.