Dies ist eine Erweiterung (entschuldigen Sie das Wortspiel) der Lösung von elclanrs, um Details zu Instanzmethoden aufzunehmen und einen erweiterbaren Ansatz für diesen Aspekt der Frage zu verfolgen. Ich erkenne voll und ganz an, dass dies dank David Flanagans "JavaScript: The Definitive Guide" (teilweise angepasst an diesen Kontext) zusammengestellt wurde. Beachten Sie, dass dies deutlich ausführlicher ist als andere Lösungen, aber langfristig wahrscheinlich davon profitieren würde.
Zuerst verwenden wir Davids einfache "Erweitern" -Funktion, die Eigenschaften in ein bestimmtes Objekt kopiert:
function extend(o,p) {
for (var prop in p) {
o[prop] = p[prop];
}
return o;
}
Dann implementieren wir sein Dienstprogramm zur Definition von Unterklassen:
function defineSubclass(superclass, // Constructor of our superclass
constructor, // Constructor of our new subclass
methods, // Instance methods
statics) {
constructor.prototype = Object.create(superclass.prototype);
constructor.prototype.constructor = constructor;
if (methods) extend(constructor.prototype, methods);
if (statics) extend(constructor, statics);
return constructor;
}
Für die letzte Vorbereitung erweitern wir unseren Funktionsprototyp mit Davids neuem Jiggery-Pokery:
Function.prototype.extend = function(constructor, methods, statics) {
return defineSubclass(this, constructor, methods, statics);
};
Nachdem wir unsere Monster-Klasse definiert haben, gehen wir wie folgt vor (was für alle neuen Klassen, die wir erweitern / erben möchten, wiederverwendbar ist):
var Monkey = Monster.extend(
function Monkey() {
this.bananaCount = 5;
Monster.apply(this, arguments);
},
{
eatBanana: function () {
this.bananaCount--;
this.health++;
this.growl();
}
}
);