Объекты JavaScript имеют элемент «прототип» для облегчения наследования. Но, похоже, мы можем жить отлично, даже без него, и я подумал, в чем преимущества его использования. Я задавался вопросом, какие плюсы и минусы.Зачем использовать «прототип» для наследования javascript?
Для примера рассмотрим следующее (здесь jsfiddle):
function Base (name) {
this.name = name;
this.modules = [];
return this;
}
Base.prototype =
{
initModule: function() {
// init on all the modules.
for (var i = 0; i < this.modules.length; i++)
this.modules[i].initModule();
console.log("base initModule");
}
};
function Derived(name) {
Base.call(this,name); // call base constructor with Derived context
}
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.initModule = function() {
console.log("d init module");
// calling base class functionality
Base.prototype.initModule.call(this);
}
var derived = new Derived("dname");
console.log(derived.name);
derived.initModule();
Возникает вопрос, зачем использовать 'прототип' вообще? Мы также можем сделать что-то вроде Derived = Object.create(Base);
, например (jsfiddle):
Base =
{
initModule: function() {
// init on all the modules.
for (var i = 0; i < this.modules.length; i++)
this.modules[i].initModule();
console.log("base initModule",this.name);
},
init: function(name) {
this.name = name;
this.modules = [];
}
};
Derived = Object.create(Base);
Derived.initModule = function() {
console.log("d init module");
// calling base class functionality
Base.initModule.call(this);
}
Derived.init("dname");
console.log(Derived.name);
Derived.initModule();
Один про - скорость: http://jsperf.com/prototype-vs-non-prototype/11 – StuR
Что делать, если у вас есть 4 уровня наследования? вы объявите метод newnewnewInitModule? – mpm
@mpm, вы правы, была ошибкой, я отредактировал это. – Lior