Huh. Es sieht viel komplizierter aus, als es für mich sein muss.
Eigentlich genauer schaue ich wirklich Ausnahme, was es tut, indem this._super()
in einer Methode, die Superklasse-Methode aufrufen.
Der Code führt eine Abhängigkeit von typeof==='function'
(unzuverlässig für einige Objekte), Function#toString
(argh, Funktion Zersetzung ist auch unzuverlässig), und zu entscheiden, ob basierend wickeln, ob Sie die Reihenfolge des Bytes _super
in dem Funktionskörper verwendet haben (Auch wenn Sie es nur in einer Zeichenfolge verwendet haben. Und wenn Sie versuchen, z. B. this['_'+'super']
wird es fehlschlagen).
Und wenn Sie Eigenschaften auf Ihren Funktionsobjekten speichern (z. B. MyClass.myFunction.SOME_PRIVATE_CONSTANT
, was Sie tun könnten, um Namespaces sauber zu halten), werden Sie durch das Wrapping daran gehindert, diese Eigenschaften zu erreichen. Und wenn eine Ausnahme in einer Methode ausgelöst und in einer anderen Methode desselben Objekts gefangen wird, zeigt _super
auf die falsche Sache.
All dies dient nur dazu, das Aufrufen der gleichnamigen Methode zu vereinfachen. Aber ich glaube nicht, dass das in JS sowieso besonders schwierig ist. Es ist zu schlau für sein eigenes Gut und macht das Ganze dadurch weniger zuverlässig. (Oh, und arguments.callee
ist nicht gültig im strikten Modus, obwohl das nicht wirklich seine Schuld ist, da dies geschah, nachdem er es veröffentlicht hat.)
Hier ist, was ich für Klassen im Moment verwende. Ich behaupte nicht, dass dies das "beste" JS-Klassensystem ist, weil es lädt von verschiedenen Möglichkeiten, es zu tun und eine Reihe von verschiedenen Funktionen, die Sie hinzufügen oder nicht hinzufügen möchten. Aber es ist sehr leicht und zielt darauf ab, JavaScriptic zu sein, wenn das ein Wort ist. (Es ist nicht.)
Function.prototype.makeSubclass= function() {
function Class() {
if (!(this instanceof Class))
throw 'Constructor function requires new operator';
if ('_init' in this)
this._init.apply(this, arguments);
}
if (this!==Object) {
Function.prototype.makeSubclass.nonconstructor.prototype= this.prototype;
Class.prototype= new Function.prototype.makeSubclass.nonconstructor();
}
return Class;
};
Function.prototype.makeSubclass.nonconstructor= function() {};
Es bietet:
Schutz gegen versehentliches fehlt new
. Die Alternative ist, X()
zu new X()
lautlos umzuleiten, so dass new
funktioniert. Es ist ein Toss-Up, der am besten ist; Ich ging für explizite Fehler, so dass man sich nicht an das Schreiben ohne new
gewöhnt und Probleme bei anderen Objekten verursacht, die nicht so definiert sind. So oder so ist es besser als der inakzeptable Standard von JS, this.
Eigenschaften auf window
fallen zu lassen und auf mysteriöse Weise später falsch zu gehen.
eine vererbbare _init
Methode, so dass Sie keine Konstruktor-Funktion schreiben müssen, die nur die Superklassenkonstruktorfunktion aufruft.
und das ist wirklich alles.
Hier ist, wie Sie es verwenden könnte Resig Beispiel zu implementieren:
var Person= Object.makeSubclass();
Person.prototype._init= function(isDancing) {
this.dancing= isDancing;
};
Person.prototype.dance= function() {
return this.dancing;
};
var Ninja = Person.makeSubclass();
Ninja.prototype._init= function() {
Person.prototype._init.call(this, false);
};
Ninja.prototype.swingSword= function() {
return true;
};
var p= new Person(true);
p.dance(); // => true
var n = new Ninja();
n.dance(); // => false
n.swingSword(); // => true
// Should all be true
p instanceof Person &&
n instanceof Ninja && n instanceof Person
Oberklasse-calling erfolgt durch speziell Benennung der Methode, die Sie wollen und call
ing es, ein bisschen wie in Python. Sie könnte ein _super
Mitglied der Konstruktorfunktion hinzufügen, wenn Sie wieder Person
benennen wollten (so würden Sie sagen Ninja._super.prototype._init.call
oder vielleicht Ninja._base._init.call
).
Ich habe Javascript gesehen „in Produktion ", die Baby-Kätzchen-Engel zum Weinen bringt, also liegt es wirklich an Ihnen, zu entscheiden, welchen Einfluss es auf Ihre Unit-/Page-Tests haben wird. Es ist so einfach, dass man sich schwer vorstellen kann, dass es ernsthafte Probleme verursacht. – Pointy
+1 Spitze. Ich habe gerade unten kritisiert, aber wirklich 99% der Websites haben mehr fragwürdigen Code als das auf ihnen bereits ... – bobince
jQuery für einen Start ... –