2014-11-27 5 views
6

Ich stolperte über die Dokumentation für den neuen (für ES6 vorgeschlagen, aber bereits in Firefox, Chrome & Opera implementiert) Datentyp in JavaScript, Symbol:Was sind die möglichen Verwendungsszenarien für den neuen JavaScript- "Symbol" -Datentyp?

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

ich darüber bin Lesen, aber ich kann mir einfach kein mögliches Nutzungsszenario vorstellen.

Die Dokumentation sagt:

Ein Symbol ein eindeutiger und unveränderlicher Datentyp ist, und kann als eine Kennung für die Objekteigenschaften verwendet werden.

OK, fein, sagen wir, ich tun, wie die Dokumentation sagt:

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

aber, da Symbol ('a') immer eindeutigen Wert zurückgibt (Objekt) und:

Symbole sind in ... in Iterationen nicht sichtbar.

wie rufe ich mein Eigentum von obj?

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

aber was ist der Zweck es auf diese Weise zu tun:

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>

bearbeiten

Natürlich können Sie es wie folgt abrufen?

Vielen Dank im Voraus :)

+0

vielleicht die klassische Kapselung Anwendungsfälle? – rahpuser

Antwort

8

Nach der Dokumentation zu lesen und ein wenig mit dieser Symbol Art in Chrom spielt, scheint es, dass ein Symbol ein Weg, um einen Namen zu definieren - keine Wert - und die Tatsache, dass Eigenschaften definiert unter Verwendung von Symbolen nicht sichtbar sind mit for..in, Object.getOwnPropertyNames() oder JSON.stringify() Symbolen, die für Metadaten-Eigenschaften machen:

// 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 
// } 

Symbole global gemacht werden können, die Symbol.for Funktion verwenden, können so Metadaten Namen werden erstellt auf ce und über alle Projektdateien hinweg verwendet.

Der Zugriff auf den Wert mit einem Symbol erfordert einen Verweis auf das Symbol bei der Erstellung.Jeder Aufruf von Symbol() einen neuen schafft, selbst wenn die gleiche Beschreibung verwendet wird:

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

aber, ein Symbol zu schaffen Symbol.for verwendet, wird es in einem globalen Register eingetragen werden und die Beschreibung wird einen Schlüssel, meanong nur ein Symbol mit dem gleichen Schlüssel wird in der globalen Registrierung existieren:

var a = Symbol.for('a'); 
var b = Symbol.for('a'); 
a == b 
// and 
a == Symbol.for('a') 
Verwandte Themen