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?
>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?
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:
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.")
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.
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.
Tags und Links javascript prototype