2014-11-27 12 views
6

Ho appena imbattuto la documentazione per il nuovo (proposta per ES6, ma già implementato in Firefox, Chrome & Opera) tipo di dati in JavaScript, Symbol:Quali sono i possibili scenari di utilizzo per il nuovo tipo di dati "Symbol" di JavaScript?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol http://people.mozilla.org/~jorendorff/es6-draft.html#sec-symbol-objects

sto leggendo su di esso, ma non riesco a pensare a un possibile scenario di utilizzo.

La documentazione dice:

Un simbolo è un tipo di dati unica e immutabile e può essere usato come un identificatore per le proprietà degli oggetti.

OK, va bene, diciamo che faccio come la documentazione dice:

obj[Symbol("a")] = "a"; 

ma, dal momento Simbolo ('a') restituisce sempre valore unico (oggetto) e:

I simboli non sono visibili in per ... in iterazioni.

come posso recuperare la mia proprietà da obj?

var obj = { normalProperty: 'just a string' }; 
 
obj[Symbol('a')] = 'a'; 
 

 
document.getElementById('retrieve').addEventListener('click', function() { 
 
    document.write('Stringified object:' + JSON.stringify(obj) + '<br/><br/>'); 
 
    document.write('Trying to get Symbol-property value, aaaand...: <br/>'); 
 
    document.write(obj[Symbol('a')]); // undefined 
 
}, false);
<button id="retrieve">Retrieve obj's property</button>

Modifica

Naturalmente, è possibile recuperare in questo modo:

var x = Symbol('a'); 
obj[x] = 'a'; 
obj[x]; // "a" 

ma qual è il scopo di farlo in questo modo?

Grazie in anticipo :)

+0

forse i classici casi d'uso di incapsulamento? – rahpuser

risposta

8

Dopo aver letto la documentazione e giocare un po 'con questo tipo Symbol in cromo, sembra che un Symbol è un modo per definire un nome - non è un valore - e il fatto che le proprietà definite utilizzando simboli non sono visibili utilizzando for..in, Object.getOwnPropertyNames() o JSON.stringify() rende simboli utili oggetti metadati:

// define metadata symbols 
var Metadata = { 
     Date: Symbol('Message date') 
}; 

var email = function(recipient, message) { 
    this.Recipient = recipient; 
    this.Message = message; 
    this[Metadata.Date] = new Date(); 
}; 

var email1 = new email('@Me', 'test'); 
JSON.stringify(email1); 
// { 
// Recipient: '@Me', 
// Message: 'test' 
// } 

// Date is still accessible using 
email1[Metadata.Date]; 
// Thu Nov 27 2014 16:50:00 GMT+0000 

// Debugging in Console: 
// { 
// Recipient: '@Me', 
// Message: 'test' 
// Symbol(Message date): Thu Nov 27 2014 16:50:00 GMT+0000 
// } 

simboli possono essere effettuate globale utilizzando la funzione Symbol.for, denominazioni metadati possono essere creati su ce e utilizzato in tutti i file di progetto.

Per accedere al valore tramite un simbolo è necessario avere un riferimento al simbolo una volta creato.Ogni chiamata a Symbol() crea uno nuovo, anche se la stessa descrizione viene utilizzata:

var a = Symbol('a'); 
var b = Symbol('a'); 
a != b 
// and 
a != Symbol('a') 

ma, la creazione di un simbolo utilizzando Symbol.for, sarà registrato in un registro globale e la descrizione diventa una chiave, meanong solo simbolo con la stessa chiave esisterà nel registro globale:

var a = Symbol.for('a'); 
var b = Symbol.for('a'); 
a == b 
// and 
a == Symbol.for('a') 
Problemi correlati