Sto esaminando l’implementazione di membri privati in TypeScript, e trovo un po ‘di confusione. Intellisense non consente di accedere a membri privati, ma in puro JavaScript, è tutto lì. Questo mi fa pensare che TS non implementa correttamente i membri privati. qualche idea?
class Test{ private member: any = "private member"; } alert(new Test().member);
Proprio come per il controllo del tipo, la privacy dei membri viene applicata solo all’interno del compilatore.
Una proprietà privata è implementata come una proprietà normale e il codice esterno alla class non è autorizzato ad accedervi.
Per rendere qualcosa di veramente privato all’interno della class, non può essere un membro della class, sarebbe una variabile locale creata all’interno di un ambito di funzione all’interno del codice che crea l’object. Ciò significherebbe che non puoi accedervi come un membro della class, cioè utilizzando la parola chiave this
.
JavaScript supporta variabili private.
function MyClass() { var myPrivateVar = 3; this.doSomething = function() { return myPrivateVar++; } }
In TypeScript questo sarebbe express in questo modo:
class MyClass { doSomething: () => number; constructor() { var myPrivateVar = 3; this.doSomething = function () { return myPrivateVar++; } } }
MODIFICARE
Questo approccio dovrebbe essere usato solo in modo SPARINGLY dove è assolutamente necessario. Ad esempio se è necessario memorizzare temporaneamente una password nella cache.
Ci sono costi di prestazioni per l’utilizzo di questo modello (irrilevante di Javascript o Typescript) e dovrebbero essere utilizzati solo dove assolutamente necessario.
Una volta che il supporto per WeakMap è più ampiamente disponibile, qui c’è una tecnica interessante illustrata nell’Esempio # 3.
Permette di dati privati ed evita i costi delle prestazioni dell’esempio di Jason Evans consentendo ai dati di essere accessibili da metodi di prototipo invece che da metodi di istanza.
La pagina MDN WeakMap collegata elenca il supporto del browser su Chrome 36, Firefox 6.0, IE 11, Opera 23 e Safari 7.1.
let _counter = new WeakMap(); let _action = new WeakMap(); class Countdown { constructor(counter, action) { _counter.set(this, counter); _action.set(this, action); } decrement() { let counter = _counter.get(this); if (counter < 1) return; counter--; _counter.set(this, counter); if (counter === 0) { _action.get(this)(); } } }
Grazie a Sean Feldman per il link alla discussione ufficiale su questo tema – vedi la sua risposta al link.
Ho letto la discussione a cui si è collegato, ed ecco un riassunto dei punti chiave:
this
senza una sorta di soluzione alternativa @private
metodi privati con @private
modo che i minisatori riconoscano che l’annotazione può effettivamente ridurre i nomi dei metodi
Contro-argomenti generali per l’aggiunta del supporto per la visibilità nel codice emesso:
In TypeScript, le funzioni private sono accessibili solo all’interno della class. Piace
E mostrerà un errore quando si tenta di accedere a un membro privato. Ecco l’esempio:
Nota: andrà bene con javascript ed entrambe le funzioni sono accessibili all’esterno.