Private und public-Variablen, um eine backbone-view
In einem backbone-Ansicht, wo würden Sie Ihre private Variablen und Ihre öffentlichkeit.
Nun habe ich so etwas wie dieses:
myView = Backbone.View.extend({
initialize: function(options){
this.myPublic = "I'm public";
}
});
Ich habe versucht, das hinzufügen einer var myPrivate
bevor die initialize-Methode, aber Sie warf einen Fehler. Wo würde private Variablen sind nur innerhalb der view gehen?
Können Sie erklären, warum Sie versuchen, dies zu tun? Es ist nicht wirklich ein straight-forward-Lösung.
nicht viel zu erklären appart aus, wie kann ich eine private-Eigenschaft auf einen Blick. Beispiel var myPrivate = "private property" sollte es aber verfügbar sein, um die gesamte Ansicht einfach wie dieses.myPublic ist. Außer diesem.myPublic zugreifen kann die view-Instanz. myPrivate ist der Zugriff nur von innerhalb des view-Methoden selbst
Siehe diese Antwort: stackoverflow.com/questions/8924961/...
nicht viel zu erklären appart aus, wie kann ich eine private-Eigenschaft auf einen Blick. Beispiel var myPrivate = "private property" sollte es aber verfügbar sein, um die gesamte Ansicht einfach wie dieses.myPublic ist. Außer diesem.myPublic zugreifen kann die view-Instanz. myPrivate ist der Zugriff nur von innerhalb des view-Methoden selbst
Siehe diese Antwort: stackoverflow.com/questions/8924961/...
InformationsquelleAutor Chapsterj | 2011-09-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich schlage vor, Sie verwenden Sie die initialize-Methode als Verschluss um alle anderen Methoden. Ich denke, das wird geben, Sie Verhalten sich mehr im Einklang mit, was wir bekommen, in der klassischen Vererbung in Programmiersprachen wie C++ und Java:
Ja. Ich weiß nicht, ob das eine Verlangsamung jemand fühlen würde, obwohl, aber es wird definitiv mehr Platz einnehmen im Speicher.
InformationsquelleAutor Near Privman
Wickeln Sie es in ein selbst-Berufung auf anonyme Funktion:
Edit: Wie bereits in kaustubh Kommentar unten, das obige Beispiel erzeugt eine private variable, die unter den gemeinsamen Instanzen. Man könnte daraus eine Art geschützt variable, das heißt, eine Instanz level-variable, die gelesen werden konnte, die durch andere Instanzen der View. Geben Sie jeder Instanz einen eindeutigen public-id und store-Instanz-Variablen in einer "private static" - variable. Dann Zugriff auf die Variablen von Instanz-id:
Oder, Sie können es tun, ohne über eine öffentliche id, aber es wird ein bisschen mehr kompliziert:
Ich bin kämpfen, um zu kommen mit eine Möglichkeit zum speichern von wirklich privaten Variablen. Ich poste wieder, wenn inspiration Streiks.
Guter Fang, vielen Dank!
Dank Gazler, Wie würden Sie erstellen eine Instanz dieser Ansicht. oder wie würden Sie in der Lage sein, um die Referenz zum erstellen einer Instanz des view -
zurück
myView
aus der unmittelbaren Funktion und weisen Sie das Ergebnis einer Variablen zu:MyView = (function(){ /* ... */ return myView; })()
. jetzt können Sie instantiat MyView:new MyView()
Wenn es mehr als 1 Instanzen der gleichen Ansicht, die privaten Variablen geteilt wird. Es ist mehr wie private statische variable. Können wir wahre private Variablen?
InformationsquelleAutor gilly3
Anstelle von einfügen das Objekt direkt in die extend-Funktion, wie etwa die Schaffung einer Schließung und aus, dass die Schließung ein Objekt wieder in die extend-Funktion?
Habe ich noch nicht ausprobiert, weil ich kein Rückgrat, installieren Sie schon jetzt.
InformationsquelleAutor jgroenen
gilly3 die Lösung ist vielleicht die beste Antwort, obwohl es technisch nicht schaffen/eine private variable, weil andere Instanzen der gleichen Schließung Zugang zu (Sie wohl nicht so besorgt über die anderen Mitglieder Ihrer Entwicklungsteams missbrauchen dieses Privileg, aber es könnte passieren).
Wenn Sie möchten, verwenden Sie die privaten Variablen ohne Verwendung gilly3 Ansatz, der Nähe Privman die Antwort scheint zu sein, die einzig wahre Lösung, wie Douglas Crockford erklärt, wie man erstellen Sie private Variablen, hier: http://javascript.crockford.com/private.html
Diese fügen Sie zusätzliche javascript-Verarbeitung Zeit, da Sie nicht in der Lage zu nutzen prototypal inheritance und werden mit Ressourcen, um erstellen Sie die Funktion jedes mal.
Dies kann jedoch nicht sein, einen sehr spürbaren Problem, wenn die Schließung, die Sie erstellen jedes mal, wenn sehr klein ist, oder wenn die Anzahl der Zeiten, die eine neue Instanz erstellt wird, ist minimal. In dem bemühen, zu versuchen und erhalten das beste aus beiden Welten, können Sie Delegierten einen Großteil Ihrer Methode, setzt die private variable ( über delegation Muster ), um eine statische Funktion, die einen nicht neu erstellt jedes mal. So bleibt Ihr
publicMethodThatUsesPrivateVariable
Methode gezeigt, unten kleiner, was bedeutet, dass es weniger Zeit, um neu jedes mal.Beachten Sie, dass der obige code sollte eingewickelt werden in eine Art von Funktion, so dass
_privateStaticMethod
ist keine Globale variable/Funktion.InformationsquelleAutor Steven
Ich war gefallen in der Nähe von Privman Antwort, bis ich lief in ein problem mit dem überschreiben einer "super-Methode". Als
initialize()
ist nicht genannt, bis irgendeine Weise durch den Aufbau eines Backbone-Objekt, das überschreiben kann nicht geschehen durch die Zeit, die es braucht, um (wenn es braucht, um vorinitialize()
genannt wird).Insbesondere kann dies ein problem mit
parse()
. (Nicht ein Problem für die Aussicht, aber auf jeden Fall für die Kollektionen und Modelle.) Angesichts dieses setup:MySubModel.parse()
wird nie aufgerufen werden.Stattdessen habe ich gefunden, dass die Verwendung eines IIFE anstelle des initialize () - beide klärt das problem und liest cleaner als eine Funktion, die bereits einen bestimmten Zweck (
initialize()
) tun doppelte Aufgabe als Verschluss für die Definition der rest der Klasse.Leider hat diese das gleiche problem mit "privaten" Variablen in allen Instanzen der Klasse tun, als beide gilly3 und in der Nähe von Privman Antworten. Würde Liebe zu hören, eine nicht unangenehme Art und Weise, um private Variablen möglich, aber vielleicht sollte ich einfach aufgeben und erkennen, ich bin das schreiben von JavaScript, nicht von Java/AS3/C++.
InformationsquelleAutor ericsoco
Können Sie versuchen, diese:
InformationsquelleAutor Marble Daemon
Den standard-Rückgrat Art und Weise der Zugabe von "privaten" Variablen deklarieren diese als Attribute mit einem Unterstrich "_" vor Ihnen. Sie sind nicht wirklich privat, aber die Entwickler erkennen, dass Sie sind nicht gedacht, um öffentlich verwendet.
Diese, in der Tat, ist wie Rückgrat speichert seine eigenen Variablen.
InformationsquelleAutor Donald Taylor
Im Zusammenhang mit Broserify.js mit Rückgrat (und wirklich alle oben genannten medium-Projekt) habe ich den folgenden Weg gefunden zu haben private Variable und Funktionen:
myView.js
InformationsquelleAutor Symba
Verwendung von "diese"?
hinzufügen. Dann sind diese geschützt atleast.
InformationsquelleAutor zzz