Zugriffsmodifizierer (Private, Protected) in ES6
Anmerkung: ich habe schon ging durch die unten SO Frage, und 7 Antworten (wie jetzt) über Symbole, WeekMaps und Karten, Bitte Lesen Sie die vollständige Frage an, bevor Sie abstimmen: Private Eigenschaften in JavaScript-ES6-Klassen
Artikel: https://esdiscuss.org/topic/es7-property-initializers
Unten ist mein Simple Class
enthält Private -, Public-und Protected-Eigenschaften und-Methoden.
JS:
'use strict';
class MyClass {
constructor () {
this.publicVar = 'This is Public Variable';
this.privateVar = 'This is Private Variable';
this.protectedVar = 'This is Protected Variable';
} //Public Constructor Method.
publicMethod () {
console.log(' Accessing this.publicVar: ', this.publicVar);
console.log(' Accessing this.privateVar: ', this.privateVar);
console.log(' Accessing this.protectedVar: ', this.protectedVar);
return 'Its Public Method'
} //Public Method.
privateMethod () {return 'Its Private Method'} //Private Method.
protectedMethod () {return 'Its Protected Method'} //Protected Method.
foo () {
this.publicMethod();
this.privateMethod();
this.protectedMethod();
} //Public Method
} //end class
Ich bin der Instanziierung des Objekts und Aufruf der öffentlichen Methode, die funktioniert wie erwartet.
let MyObject = new MyClass;
MyObject.foo(); //Works fine.
console.log( MyObject.publicVar ); //Works
console.log( MyObject.publicMethod() ); //Works
Arbeiten wie erwartet.
Nun meine Frage. Ich bin mir bewusst, dass einige Dinge wie das Symbol in der ES6-Spezifikation, was ist der aktuelle workaround, um geschützte und private Variablen/Methoden arbeiten auf ES6-Klassen.
console.log( MyObject.privateVar ); //Works
console.log( MyObject.privateMethod() ); //Works
Möchte ich diese Eigenschaft und eine Methode zu sein, sichtbar nur in der eigenen Klasse.
console.log( MyObject.protectedVar ); //Works
console.log( MyObject.protectedMethod() ); //Works
Möchte ich diese Eigenschaft und eine Methode, um sichtbar zu werden in seiner eigenen Klasse und innerhalb der Klassen erweitern.
Workaround /bessere Lösung, um dieses Verhalten zu erzielen ist geschätzt
- Wenn Sie bereits darüber Lesen, Symbole und WeakMap, was Sie sonst noch wissen müssen?
- Ich habe durch diese aber erwarten die beispielsweise als Antwort zu beschränken und erweiterten Klasse-Bereich als gut
- ES6-Klassen keine private/protected absichtlich: siehe hier WeakMap/Symbole ist mehr ein workaround, um Sie in ES6-Klassen, aber ES6-Klassen, das sind mehr eine Art und Weise zu definieren, die Methoden, als zu replizieren "classic" - OO-Klassen, in Sprachen wie Java und C#
Du musst angemeldet sein, um einen Kommentar abzugeben.
Private Eigenschaften
In ES6 (und vor), alle private Eigenschaft Implementierungen auf Verschluss.
Menschen mache es, noch bevor JavaScript-Versionen.
WeakMap ist nur eine Variante, die beseitigt die Notwendigkeit, neue Möglichkeiten und neue Funktionen, die für jedes neue Objekt, auf Kosten der Zugriffsgeschwindigkeit.
Symbol ist ein ES6 variation, verbirgt sich das Attribut aus gemeinsamen Operationen, wie einfache property-Zugriff oder
for in
.JS:
Wie oben gesehen, kann es umgangen werden, indem Objekt.getOwnPropertySymbols().
Trotz seiner Existenz, ich habe immer die Wahl-symbol über WeakMap.
Der code ist sauberer, einfacher, weniger gc-Arbeit, und (ich glaube) effizienter.
Geschützte Eigenschaften
Geschützte Eigenschaften, durch seine Natur, erfordert die Ausführung von Funktion zu wissen, das Objekt des aufrufenden Codes, um zu beurteilen, ob Sie Zutritt haben soll.
Dies ist unmöglich in JS, nicht, weil ES6 hat keine echte Klasse, sondern weil Anrufer Kontext ist einfach nicht.
Aufgrund verschiedene Besondere Naturen von JavaScript, für die vorhersehbare Zukunft geschützt, die Eigenschaften bleiben unmöglich.
Alternativ...
Paket Eigenschaften
Einige Sprachen sind semi-protected-Eigenschaften, die manchmal auch als "package private", wo die Methode /Eigenschaft ist für Mitglieder zugänglich, die in das gleiche Modul /Paket.
ES6 implementieren können, mit Verschluss.
Es ist genau das gleiche wie das private Eigentum obigen code - Teile einfach den Umfang und die Symbole mit mehreren Prototypen.
Aber das ist unpraktisch, da dies erfordert, dass das gesamte Modul definiert werden, die unter dem gleichen geschlossenen Rahmen, d.h. in einer einzigen Datei.
Aber es ist eine option dennoch.
Ich bin zu spät, diese zu beantworten, aber es ist möglich zu emulieren, private UND protected Methoden in javascript.
Privaten Methoden/Eigenschaften
Verwendet das bekannte Symbol Ansatz
Geschützte Methoden/Eigenschaften
Durch Ihre Natur, geschützte member sichtbar sind abgeleitete Klassen. Sie müssen auch imitieren die
super.method
Muster.symbols.js
parent.js
child.js
import symbols from './symbols'