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 newBediener 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 newBediener angewendet werden:
var subInstance = new Sub();
Der Unterschied zum ersten Beispiel besteht darin, dass, wenn wir applyden SuperKonstruktor zum thisObjekt im Inneren Subhinzufügen, die Eigenschaften hinzugefügt werden, die thison zugewiesen wurden Super, direkt in der neuen Instanz, z. B. subInstancedie Eigenschaften enthält member1und member2direkt (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 newOperator nicht verwenden, und wie Sie sehen können, ist das thisSchlüsselwort nicht beteiligt.
var subInstance = createSub();
ECMAScript 5th Ed. Object.createMethode:
// 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 subInstancenur die member3Eigenschaft enthält.