Bessere Möglichkeit, auf private Mitglieder in Javascript zuzugreifen

7

Nachdem ich ein wenig über das prototypische Vererbungsmodell von Javascript gelesen habe, ändere ich meinen Stil, eine Klasse aus

zu konstruieren %Vor%

bis

%Vor%

Obwohl ich verstehe, dass dies eine gute Praxis ist, aber ich nicht mehr auf private Methoden von der öffentlichen Methode zugreifen darf

%Vor%

Nach dem Lesen eines Artikels hier (Closure-created Konstruktor), dann kam ich mit diesem

heraus %Vor%

Was sind jedoch die Nachteile, dies zu tun ?! oder gibt es eine bessere Möglichkeit, dies zu tun, wenn ich auf privates Mitglied in der öffentlichen Methode zugreifen möchte?

>     
Jeffrey04 25.06.2009, 03:13
quelle

5 Antworten

10

Die Verwendung von Funktionsumfangvariablen und -schließungen zum Simulieren von privaten Variablen / Funktionen ist in der JavaScript-Community ein gut eingeführtes Idiom. Wenn die Variable wirklich privat sein soll, sehe ich keinen Nachteil für diesen Ansatz (obwohl einige behaupten, dass performanter Code auf bestimmten Browsern / Hosts darauf achten muss, wie viele Verschlüsse erstellt werden).

In Ihrem Beispiel wird die private_method (und ihre Umgebung) für alle Objekte freigegeben - da Ihre closure_method-Schließung nur beim ersten Erstellen des Objekts erstellt wird (und an die Prototypeigenschaft des Konstruktors gebunden wird, die die interne Prototypkette des erstellten Objekts festlegt) ) - also ist die private_methode, die verwendet wird, nur die, die beim ersten Mal erstellt wurde.

Hier ist ein Beispielcode, der veranschaulichen soll, was vor sich geht:

%Vor%

Sind Sie sicher, dass Sie das wollen?

Wenn Ihre private_Methode nicht auf den Status des umschließenden Objekts verweisen muss, sehe ich wenig Nutzen darin, die Dinge so zu machen, wie Sie es tun.

Was ich normalerweise mache (wenn ich 'neu' benutzen muss, um mein Objekt zu erstellen), ist folgendes:

%Vor%

Der Nachteil dieses Ansatzes besteht darin, dass Sie jedes Mal, wenn Sie das Objekt über "neu" erstellen, alle Schließungen neu erstellen. Aber wenn mein Profiler mir nicht sagt, dass diese Designauswahl optimiert werden muss, bevorzuge ich seine Einfachheit und Klarheit.

Ich sehe auch nicht den Vorteil in Ihrem Code, Folgendes zu tun:

%Vor%

Warum erstellen Sie in Ihrem Konstruktor einen separaten Bereich?

    
Faisal Vali 25.06.2009, 03:18
quelle
11

Meine Antwort ist eine Nicht-Antwort: Es gibt keinen integrierten private -Zugriff in JavaScript, aber das ist in Ordnung, weil YAGNI . So mache ich private members in meinem Code:

%Vor%

Das ist gut genug. Es ist nicht wirklich wert, durch Reifen zu springen, wenn der einzige wirkliche Zweck von private ist, dich vor ... sich selbst zu schützen.

(Ich sage das, nachdem ich viele Stunden damit verbracht habe, mit jeder Abänderung von Schließungen und Prototyping herumzuspielen, genau wie du es bist, und schließlich sagst: "Scheiß drauf, es ist es nicht wert.")

    
John Kugelman 25.06.2009 03:24
quelle
1

Wenn Sie dies noch nicht getan haben, schauen Sie sich dieses JavaScript-Modulmuster an. Dadurch können Sie auf private Methoden und Variablen innerhalb der öffentlichen Funktionen usw. zugreifen.

    
Ian Oxley 25.06.2009 12:36
quelle
1

Echo John Kugelman: Es ist unmöglich, private Mitglieder in Javascript zu erstellen. Lebe damit. Selbst wenn Sie ein solches Gehäuse erstellen:

%Vor%

Jeder Benutzer kann noch schreiben:

%Vor%

Am Ende können Sie keinem öffentlichen Mitglied vertrauen, dass es dasselbe ist, das Sie deklariert haben. Wenn jemand Ihren Code brechen möchte, wird er es tun! Ein anderer Benutzer bricht den Code nicht, nur weil er nützlich ist.

    
LMB 07.08.2012 13:12
quelle
0

Arbeitet mit Prototypen, nicht nur Singleton. Problem ist, wenn es Zeit ist, Unterklasse, hat meine Unterklasse keinen Zugriff auf die privaten

    
Dooma 26.06.2011 19:02
quelle

Tags und Links