Es hängt Schreib effizienter sein, auf Ihre Bedürfnisse und die relative Performance. Javascript ist nicht die typsicherste Sprache und nicht sehr stark in Bezug auf die Sichtbarkeit der Mitglieder. Traditionell können Sie die Sichtbarkeit "privat", "öffentlich privilegiert" und "öffentlich" innerhalb eines Javascript-Typs haben.
können Sie erklären, private und öffentliche privilegierte Mitglieder mit:
function FooClass()
{
var privateVar = 1;
function privateFn()
{
return privateVar; // etc...
}
this.publicVar = 2;
this.publicFn = function()
{
return privateFn();
}
}
In diesem Beispiel werden eine Funktion Schließung, die aus einer Funktionsdeklaration besteht, die Werte aus dem Geltungsbereich umfasst, wobei die Funktion definiert ist. Dies ist akzeptabel, wenn die Sichtbarkeit der Elemente erforderlich ist, jedoch zu einem Overhead führen kann. Der JavaScript-Interpreter kann die privateFn- oder publicFn-Definitionen nicht für jede Instanz wiederverwenden, da sie auf Variablen oder Funktionen im äußeren Bereich verweisen. Daher führt jede Instanz von FooClass zu zusätzlichem Speicherplatz für privateFn und publicFn. Wenn der Typ nur selten oder in Maßen verwendet wird, ist die Leistungseinbuße vernachlässigbar. Wenn der Typ sehr häufig auf der Seite verwendet wird oder wenn die Seite eher ein "AJAX" -Stil ist, bei dem der Speicher nicht so häufig freigegeben wird, da die Seite nicht entladen wird, kann die Strafe besser sichtbar sein.
Ein alternativer Ansatz ist die Verwendung von Prototyp-Mitgliedern. Dies sind nicht privilegierte öffentliche Mitglieder. Da Javascript nicht vollständig typsicher ist und nach dem Laden relativ einfach zu ändern ist, sind Typsicherheit und Sichtbarkeit der Elemente nicht so zuverlässig, um den Zugriff auf interne Typen zu steuern. Aus Gründen der Leistung verwenden einige Frameworks wie ASP.NET Ajax stattdessen Member-Naming, um Sichtbarkeitsregeln abzuleiten. Zum Beispiel könnte die gleiche Art in ASP.NET Ajax wie folgt aussehen:
function FooClass2()
{
this._privateVar = 1;
this.publicVar = 2;
}
FooClass2.prototype =
{
_privateFn : function()
{
return this._privateVar;
},
publicFn : function()
{
return this._privateFn();
}
}
FooClass2.registerClass("FooClass2");
In diesem Fall sind die privaten scoped Mitglieder nur dem Namen nach sind privat, das „_“ Präfix gilt eine private Variable bedeuten. Es hat den Nachteil, dass das Mitglied nicht wirklich privat ist, sondern das In-Memory-Patchen des Objekts zulassen. Der andere Hauptvorteil besteht darin, dass alle Funktionen einmal vom Interpreter und der Engine erstellt und immer wieder für den Typ wiederverwendet werden. Das Schlüsselwort "this" verweist dann auf die Instanz des Typs, obwohl die Funktionsreferenz selbst identisch ist.
Eine Möglichkeit, den Unterschied in Aktion zu sehen ist dies mit beiden Typen versuchen (wenn Sie nicht ASP.NET Ajax haben, können Sie die letzte Zeile in FooClass2 ignorieren, ruft register())
var fooA = new FooClass(), fooB = new FooClass();
alert(fooA.publicFn===fooB.publicFn); // false
var foo2A = new FooClass2(), foo2B = new FooClass2();
alert(foo2A.publicFn===foo2B.publicFn); // true
Also ist es eine Frage des Typs Sicherheit und Sichtbarkeit der Mitglieder im Vergleich zuLeistung und die Fähigkeit, im Speicher zu patch
Ihr FooClass Beispiel ist falsch. Die Semantik von new ist effektiv: "var foo = {}; foo .__ proto__ = FooClass.prototype; var temp = FooClass.call (temp); if (IsObject (temp)) foo = temp;". Das heißt, in Ihrem Beispiel wird foo das neue Objekt "{reallypublicfn: function() {...}}" sein, so dass es den FooClass-Prototyp oder die publicfn-Funktion – olliej