2016-06-15 5 views
6

Funktion Scoping bietet die einzige Privatsphäre in JavaScript.Datenschutz in JavaScript

So ist die kanonische:

function Ctor(dep1, dep2) { 
    this._dep1 = dep1; 
    this._dep2 = dep2; 
} 

Ctor.prototype.foo = function() { 
    // use this._dep1/2... 
} 

... ist problematisch, dass es keine Verkapselung für die injizierten Abhängigkeiten bietet.

Eine Alternative (wenn auch etwas anders in Bezug auf die Lage von foo), die echte Kapselung bietet könnte sein:

function factory(dep1, dep2) { 
    return { 
    foo: partial(foo, dep1, dep2), // or use bind (partial could be a library fn for partial application) 
    }; 
} 

function foo(dep1, dep2) { 
    // use dep1/2 
} 

Aber ich selten, dieses Muster sehen. Gibt es einen guten Grund, letzteres nicht zu verwenden?

+1

bis zu einem gewissen Grad, die Unterstützung für Symbol Eigenschaften werden Dinge besser machen, wie es möglich sein wird o Erstellen Sie Eigenschaftsschlüssel, die garantiert nicht mit anderen Schlüsseln kollidieren. Sie sind jedoch immer noch nicht vollständig "privat". – Pointy

+1

Vote für den Abschluss - warum ?! – Ben

Antwort

3

Sie geben bereits die Vorteile des zweiten Musters an. Die Nachteile sind:

  • Sie müssen entweder Gruppenmethoden durch Sichtbarkeit (auch wenn die private Methode innig mit einem öffentlich man verwandt ist, aber kaum auf andere private Methoden verwendet), oder wiederholen Sie alle öffentlichen Methoden in der Objektliteral (was mit jsdoc nicht gut funktioniert).

  • der Code stellt ein separates Funktionsobjekt für jede Instanz der Klasse, die ein gewisse Leistung opfert (dies in der Regel keine Rolle spielt, aber manchmal könnte)

  • im Gegensatz zu privaten Modifikatoren in vielen Programmiersprachen, diese Verkapselung nicht umgangen werden kann, auch wenn sie falsch angewandt und ich weiß wirklich, was ich tue (historisch gesehen, ist Javascript eine Umgebung, in denen alles möglich ist, und viele Attribute auf diese Erweiterbarkeit seinen Erfolg)

+0

"der Code führt ein separates Funktionsobjekt für jede Instanz Ihrer Klasse ein" - auch wenn der Code direkt, z. 'foo: foo.bind (null, dep1, dep2)'? – Ben

+0

Ja, ich habe es gerade in Chrome getestet: 'foo.bind (null, 1, 2) === foo.bind (null, 1, 2)' gibt 'false' zurück. – meriton

+0

Ach ja, du hast Recht. Danke für die Bestätigung. Auch https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind – Ben

3

Einfach: warum?

"Privatsphäre" ist schrecklich überbewertet. Es verbirgt nichts vor dem, der es wirklich will. "Geschützte" oder "private" Mitglieder zu haben, ist rein zum Vorteil des Programmierers, speziell um anzuzeigen, wie ein bestimmtes Mitglied verwendet werden soll (dies hier ist eine öffentliche API, diese hier ist nicht so bitte nicht berühren es sei denn, Sie wissen, was es tut). Das ist alles. Eine Namenskonvention wie das Starten von Unterstrichen ist vollkommen ausreichend, um dies zu implementieren. Wenn ein Mitgliedsname mit einem Unterstrich beginnt, berühren Sie ihn nicht, es sei denn, Sie wissen, was Sie tun.

Es besteht keine Notwendigkeit, sich weiter nach hinten zu beugen.

+0

Als Antwort auf Ihre Frage: "weil mit' _foo', wenn Sie in einer gemeinsamen Codebasis arbeiten, können Sie nicht sicher sein, dass es nicht verwendet wird, weil der Name 'nur ein Name' ist ". Das Vertrauen ist bei letzterem signifikant erhöht, was die nicht-funktionalen Aspekte des Codes verbessert. – Ben

+1

Wenn Sie kein Vertrauen in Ihre Mitarbeiter haben, wird es Ihnen nicht helfen, private Mitglieder privater zu machen. Das ist ein Kommunikations- und/oder Revisionsproblem zwischen Programmierern und kein zu lösendes technisches Problem. Es gibt noch viel mehr Dinge, die nicht vertrauenswürdige Programmierer vermasseln können, als auf private Mitglieder zuzugreifen. – deceze

+0

Es gibt viele Probleme in der Softwareentwicklung. Sie nennen ein paar. Heißt das, wir sollten nicht versuchen, das Risiko dieser Probleme zu mindern? – Ben

Verwandte Themen