In JavaScript gibt es keine Klassen, aber Sie können Vererbung und Wiederverwendung von Verhalten auf viele Arten erhalten:
Pseudoklassische Vererbung (durch Prototyping):
function Super () {
this.member1 = 'superMember1';
}
Super.prototype.member2 = 'superMember2';
function Sub() {
this.member3 = 'subMember3';
//...
}
Sub.prototype = new Super();
Sollte mit dem new
Bediener verwendet werden:
var subInstance = new Sub();
Funktionsanwendung oder "Konstruktorkettung":
function Super () {
this.member1 = 'superMember1';
this.member2 = 'superMember2';
}
function Sub() {
Super.apply(this, arguments);
this.member3 = 'subMember3';
}
Dieser Ansatz sollte auch beim new
Bediener angewendet werden:
var subInstance = new Sub();
Der Unterschied zum ersten Beispiel besteht darin, dass, wenn wir apply
den Super
Konstruktor zum this
Objekt im Inneren Sub
hinzufügen, die Eigenschaften hinzugefügt werden, die this
on zugewiesen wurden Super
, direkt in der neuen Instanz, z. B. subInstance
die Eigenschaften enthält member1
und member2
direkt (subInstance.hasOwnProperty('member1') == true;
).
Im ersten Beispiel werden diese Eigenschaften über die Prototypenkette erreicht , sie existieren auf einem internen [[Prototype]]
Objekt.
Parasitäre Vererbung oder Leistungskonstruktoren:
function createSuper() {
var obj = {
member1: 'superMember1',
member2: 'superMember2'
};
return obj;
}
function createSub() {
var obj = createSuper();
obj.member3 = 'subMember3';
return obj;
}
Dieser Ansatz basiert im Wesentlichen auf "Objekterweiterung", Sie müssen den new
Operator nicht verwenden, und wie Sie sehen können, ist das this
Schlüsselwort nicht beteiligt.
var subInstance = createSub();
ECMAScript 5th Ed. Object.create
Methode:
// 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';
Das obige Verfahren ist eine von Crockford vorgeschlagene prototypische Vererbungstechnik .
Objektinstanzen erben von anderen Objektinstanzen, das war's.
Diese Technik kann besser sein als eine einfache "Objekterweiterung", da die geerbten Eigenschaften nicht über alle neuen Objektinstanzen kopiert werden, da das Basisobjekt als das [[Prototype]]
des erweiterten Objekts festgelegt ist und im obigen Beispiel subInstance
nur die member3
Eigenschaft enthält.