In JavaScript non hai classi ma puoi ottenere ereditarietà e riutilizzo del comportamento in molti modi:
Eredità pseudo-classica (tramite prototipazione):
function Super () {
this.member1 = 'superMember1';
}
Super.prototype.member2 = 'superMember2';
function Sub() {
this.member3 = 'subMember3';
//...
}
Sub.prototype = new Super();
Dovrebbe essere utilizzato con l' new
operatore:
var subInstance = new Sub();
Applicazione della funzione o "concatenamento del costruttore":
function Super () {
this.member1 = 'superMember1';
this.member2 = 'superMember2';
}
function Sub() {
Super.apply(this, arguments);
this.member3 = 'subMember3';
}
Questo approccio dovrebbe essere utilizzato anche con l' new
operatore:
var subInstance = new Sub();
La differenza con il primo esempio è che quando abbiamo apply
il Super
costruttore this
dell'oggetto all'interno Sub
, aggiunge le proprietà assegnate a this
on Super
, direttamente sulla nuova istanza, ad esempio subInstance
contiene le proprietà member1
e member2
direttamente ( subInstance.hasOwnProperty('member1') == true;
).
Nel primo esempio, quelle proprietà vengono raggiunte attraverso la catena del prototipo , esistono su un [[Prototype]]
oggetto interno .
Eredità parassitaria o Power Constructors:
function createSuper() {
var obj = {
member1: 'superMember1',
member2: 'superMember2'
};
return obj;
}
function createSub() {
var obj = createSuper();
obj.member3 = 'subMember3';
return obj;
}
Questo approccio si basa fondamentalmente sull '"aumento degli oggetti", non è necessario utilizzare l' new
operatore e, come puoi vedere, la this
parola chiave non è coinvolta.
var subInstance = createSub();
ECMAScript 5a Ed. Object.create
metodo:
// Check if native implementation available
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {} // empty constructor
F.prototype = o; // set base object as prototype
return new F(); // return empty object with right [[Prototype]]
};
}
var superInstance = {
member1: 'superMember1',
member2: 'superMember2'
};
var subInstance = Object.create(superInstance);
subInstance.member3 = 'subMember3';
Il metodo sopra è una tecnica di ereditarietà prototipale proposta da Crockford .
Le istanze di oggetti ereditano da altre istanze di oggetti, questo è tutto.
Questa tecnica può essere migliore di semplice "oggetto conversione" perché le proprietà ereditate non vengono copiate tutte le nuove istanze di oggetto, poiché la base di oggetto viene impostato come [[Prototype]]
del estesa oggetto, nell'esempio di cui sopra subInstance
contiene fisicamente solo la member3
struttura.