Gli oggetti JavaScript hanno il membro "prototype" per facilitare l'ereditarietà. Ma a quanto pare, possiamo vivere perfettamente bene, anche senza di esso, e mi chiedevo, quali sono i vantaggi di usarlo. Mi sono chiesto quali sono i pro e i contro.Perché utilizzare "prototype" per l'ereditarietà di javascript?
Per esempio, si consideri il seguente (qui 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();
Una domanda è, perché usare 'prototipo' a tutti? Possiamo anche fare qualcosa di simile Derived = Object.create(Base);
per esempio (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();
Un professionista è la velocità: http://jsperf.com/prototype-vs-non-prototype/11 – StuR
cosa succede se si dispone di un livello 4 sull'ereditarietà? dichiarerai un metodo newnewnewInitModule? – mpm
@mpm hai ragione, è stato un errore, l'ho modificato via – Lior