Wie Erstellen Sie Geschützte Objekt-Eigenschaften in JavaScript
Ist es eine JavaScript-Muster, das imitiert "Geschützt" Objekt-Eigenschaften wie, was Sie sehen in Sprachen wie C++ ??
Im Grunde genommen, ich möchte ein Objekt erstellen, ist Eine, die hat eine Reihe von "geschützt" Objekteigenschaften zugegriffen werden kann NUR von Methoden definiert werden, aus dem Prototyp-Objekt A. D. H. - NICHT öffentlich zugängliche-von den nicht-prototypischen Methoden von A.
Beispielsweise ideal wäre etwa so:
function A(){
var prop1 = 1;
}
A.prototype.myFunc = function(){
var newVar = this.prop1; //newVar now is equivalent to 1
}
var instanceOfA = new A();
var newVar2 = instanceOfA.prop1; //error given as prop1 is "protected"; hence undefined in this case
BTW - ich will nicht das Muster der privilegierten member-Funktionen Zugriff auf private Eigenschaften, da Sie die member-Funktion ist immer noch öffentlich.
NÖ............
Mein Tipp, wie so oft, nicht mit Gewalt die Sichtbarkeit in JavaScript. Etwas Dinge möglich sind, mit Verschluss etc, aber die Sprache ist nicht dafür vorgesehen. Es wird Ihr code komplexer. Stattdessen dokumentieren Sie Ihre Methoden richtig als private oder public, und wenn es andere Entwickler tun nicht Folgen Sie Ihrer Spezifikation, ist es Ihr problem.
Btw, Prototyp-Objekte können ergänzt werden (Sie sind nicht abgedichtet) - nichts verhindert, dass ein Eindringling das hinzufügen neuer Methoden, um das Prototyp-Objekt. So eine Eigenschaft kann ausschließlich über Prototypen Methoden wäre nicht sicher sowieso (selbst wenn es möglich wäre).
JavaScript-ist das nicht Klasse-orientiert, Objekt-orientierte-nicht im Sinne von Objekt-orientiert, bezieht sich auf Instanzen der Klasse, sondern im Sinne von... einfach nur Objekte. Es gibt keine Funktionen wie Ihre übliche Klasse Mitglied Schlüsselwörter in Java oder C++, müssen Sie stattdessen gestalten Sie Ihre Implementierung auf der Basis des Objekt-und event-driven Natur der Sprache.
Es gibt Lösungen, auf der Grundlage der neuen features in ES6. Siehe zum Beispiel hier: philipwalton.com/articles/...
Mein Tipp, wie so oft, nicht mit Gewalt die Sichtbarkeit in JavaScript. Etwas Dinge möglich sind, mit Verschluss etc, aber die Sprache ist nicht dafür vorgesehen. Es wird Ihr code komplexer. Stattdessen dokumentieren Sie Ihre Methoden richtig als private oder public, und wenn es andere Entwickler tun nicht Folgen Sie Ihrer Spezifikation, ist es Ihr problem.
Btw, Prototyp-Objekte können ergänzt werden (Sie sind nicht abgedichtet) - nichts verhindert, dass ein Eindringling das hinzufügen neuer Methoden, um das Prototyp-Objekt. So eine Eigenschaft kann ausschließlich über Prototypen Methoden wäre nicht sicher sowieso (selbst wenn es möglich wäre).
JavaScript-ist das nicht Klasse-orientiert, Objekt-orientierte-nicht im Sinne von Objekt-orientiert, bezieht sich auf Instanzen der Klasse, sondern im Sinne von... einfach nur Objekte. Es gibt keine Funktionen wie Ihre übliche Klasse Mitglied Schlüsselwörter in Java oder C++, müssen Sie stattdessen gestalten Sie Ihre Implementierung auf der Basis des Objekt-und event-driven Natur der Sprache.
Es gibt Lösungen, auf der Grundlage der neuen features in ES6. Siehe zum Beispiel hier: philipwalton.com/articles/...
InformationsquelleAutor Drake Amara | 2011-11-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist keine Objekt-Eigenschaft, die nur zugegriffen werden kann, von Prototyp-Methoden der
A
und nicht von den nicht-prototypischen Methoden derA
. Die Sprache hat nicht diesen Typ von Funktion und ich bin mir nicht bewusst, irgendwelche work-around/hack um es zu implementieren.Mit Doug Crockford ' s Methoden, die Sie erstellen können, die Eigenschaften, die nur zugegriffen werden kann, aus vordefinierten nicht-Prototyp-Methoden (definiert im Konstruktor). Also, wenn Sie versuchen, um den Zugriff nur auf einen vordefinierten Satz von Methoden, dies zu erreichen. Andere als die, ich glaube, Sie sind aus Glück heraus.
Wenn Sie möchten, dass andere Ideen, Sie würden wahrscheinlich mehr helfen, wenn du beschreiben, was du eigentlich erreichen wollen in Ihrem code statt, wie zum emulieren einer Funktion in einer anderen Sprache. Javascript ist so viel anders als C++ , ist es besser, zu beginnen, von den Bedürfnissen des Problems anstatt zu versuchen zu finden eine Analogie zu C++ - Funktion.
InformationsquelleAutor
Du es nicht in Javascript.
Das ist wahr, versuchen zu tun, sonst ist das viel schädlicher ist als die Annahme, diese einfache Tatsache.
{{citation needed}}
Zitat nicht erforderlich. Es ist eine Tatsache. Werden Sie nicht finden jede Erwähnung von protected-Variablen in der Javascript-Spezifikation (D. H. es ist unmöglich, zu zitieren).
Es ist sehr viel möglich, protected-Elemente in Javascript verwenden WeakMap. Es ist auch möglich zu emulieren WeakMap in ES5 (zurück im Jahr 2011, als Sie machte diesen Kommentar). gist.github.com/Benvie/3179490
InformationsquelleAutor
Ich einen Weg gefunden, für die Erstellung von geschützten Mitglieder. Deshalb rufe ich die Basis-Konstruktor und gibt ein Objekt zurück mit den geschützten Mitglieder gleichzeitig:
Hier ein Beispiel:
InformationsquelleAutor
Dies ist wahrscheinlich das, was du suchst: http://javascript.crockford.com/private.html
the
definitive Beschreibung der Optionen für die member-variable in die Privatsphäre. Dies ist, was verfügbar ist. Sie sind alle eher hacks, da jedes Mitglied variabel, offiziell unterstützt durch die Sprache ist öffentlich, aber Sie können, erhalten Sie die Privatsphäre in unterschiedlicher Weise durch die Verwendung von Verschlüssen.Die OP erklärte, er sei nicht daran interessiert, privilegierte Funktionen...
Ich möchte auch darauf hinweisen, dass, während Sie können tun, was Crockford hat in diesem Artikel bedeutet nicht, sollten Sie es tun. Programm in der Sprache X wie Sie die Programmierung für die Sprache X, die nicht in Sprache Y. Das heißt, es gibt einige legitime verwendet für (!ÄHEM!) private Variablen (ich glaube, mein Mund blutete, indem Sie sagen, dass) in JS, aber ich werde nicht darauf eingehen, da diese Nutzungen nicht wirklich was zu tun mit Klasse design, so zu sprechen.
InformationsquelleAutor
InformationsquelleAutor
Ich war daran interessiert, einen Weg zu finden, um Ihre Frage zu beantworten, und hier ist, was ich war in der Lage, das zu tun.
Müssen Sie diesen Helfer:
Dieser Helfer können Sie in der Lage mehrere Erbschaften. Der trick ist, kopieren Sie die geschützte variable von der Basis-Objekt zu Ihrem neuen Objekt (Kind).
Um Ihnen zu beweisen, das es funktioniert, hier ein Beispiel:
Und hier sind die tests:
InformationsquelleAutor
Es ist ein Muster, die ich wie dass nicht auf die gleiche Weise, wie Sie geschützt-Zugang ist in den meisten Sprachen, bietet aber eine ähnliche Leistung.
Im Grunde, verwenden Sie einen builder-Methode erstellen Sie einen Verschluss für die Eigenschaften, und dann haben diese Methode erstellt eine "volle" Objekt mit liberal-Zugang sowie ein "ausgesetzt" Objekt mit mehr begrenzten Zugang. Ort der exponierten Objekt in einer Eigenschaft, die der vollen Objekt, und, dass die Rückkehr von full-Objekt an den Aufrufer.
Die Anrufer können dann nutzen Sie das gesamte Objekt und übergeben dieses an andere geeignete Mitarbeiter), sondern nur die freigelegte Objekt, um Mitarbeiter, sollte die mehr eingeschränkten Zugriff.
Ein erfundenes Beispiel...
Wenn wir verwenden, um zu bauen ein ring von 4 Einträgen
ring = buildRing(4);
, dannring.getHead().getIndex()
gibt uns 0,ring.getHead().getNext().getIndex()
gibt uns 1,ring.getHead().getNext().getNext().getIndex()
gibt uns 2, etc.Wenn wir versuchen, auszuführen
ring.getHead().setNext({})
oderring.getHead().getNext().setNext({})
aber bekommen wir eine Fehlermeldung, dasetNext
ist nicht eine Eigenschaft von einem exponierten Eintrag Objekt.Einschränkung:
Da dies in der Familie von mustern, die den Aufbau, die Methoden wieder in einem neuen Verschluss für jedes neue Objekt, es ist nicht für Situationen geeignet, in denen eine sehr hohe Volumen der Instanziierung erforderlich sein kann.
this
innerhalb der Konstruktor-Körper.InformationsquelleAutor
Werfen Sie einen Blick auf Abhilfe vorgeschlagen von Maks auf seiner website: Die Emulation protected-Elemente in JavaScript
Es emuliert
protected
Zugriff auf Ebene von Methoden und Eigenschaften eines Objekts.InformationsquelleAutor