Ich bevorzuge funktionale OOP-Stil für meinen Code (ähnlich dem Modulmuster), weil es mir hilft, das "neue" Schlüsselwort und alle Probleme mit dem Geltungsbereich von "diesem" Schlüsselwort zu vermeiden Rückrufe.Frage zum funktionalen OOP-Stil in JavaScript
Aber ich habe ein paar kleinere Probleme damit zu tun. Ich möchte den folgenden Code verwenden, um eine Klasse zu erstellen.
namespace.myClass = function(){
var self = {},
somePrivateVar1;
// initialization code that would call
// private or public methods
privateMethod();
self.publicMethod(); // sorry, error here
function privateMethod(){}
self.publicMethod = function(){};
return self;
}
Das Problem ist, dass ich öffentliche Methoden aus meinem Initialisierungscode nicht aufrufen kann, da diese Funktionen noch nicht definiert sind. Die offensichtliche Lösung wäre, eine Init-Methode zu erstellen und sie vor der "return self" -Zeile aufzurufen. Aber vielleicht kennen Sie eine elegantere Lösung?
Auch, wie behandeln Sie normalerweise Vererbung mit diesem Muster? Ich benutze den folgenden Code, aber ich würde gerne Ihre Ideen und Vorschläge hören.
namespace.myClass2 = function(){
var self = namespace.parentClass(),
somePrivateVar1;
var superMethod = self.someMethod;
self.someMethod = function(){
// example shows how to overwrite parent methods
superMethod();
};
return self;
}
Bearbeiten. Für diejenigen, die Frage, was die Gründe für die Wahl dieses Stils der OOP sind, können Sie folgende Fragen prüfen können:
Es ist generell eine _bad_ Idee, die Techniken einer Sprache nicht zu verwenden. Das heißt, Sie sollten 'new' nicht umgehen, das ist genau so, wie es in Javascript gemacht wird und es ist wahrscheinlich der beste Weg _in dieser speziellen Sprache_. –
Warum können Sie nicht einfach die Methoden oben definieren, bevor Sie versuchen, sie aufzurufen? –
Gs, ich denke, dass die Verwendung von Schließungen zum Erstellen von Objekten mit privaten Mitgliedern eine Technik ist, die von einer Sprache gegeben wird. Sogar Douglas Crockford tritt dafür ein. Ich habe auch vorher einige Leistungstests gemacht, und für eine kleine Anzahl von Objekten spielt es keine Rolle. (http://valums.com/b/) Aber für mich macht es einen Code sauberer. –