2016-03-20 9 views
2

Lassen Sie uns den folgenden Code nehmen:Ist es möglich, Object.defineProperties mit Symbolen zu verwenden?

var obj = {}; 
var x = Symbol(); 
Object.defineProperties(obj, { 
    [x]: { 
    value: true, 
    writable: true 
    }, 
    "property2": { 
    value: "Hello", 
    writable: false 
    } 
    // etc. etc. 
}); 
console.log(obj[x]) 

diese gültig ist?

Mit dem nativen Object.defineproperties Code erhalten wir in der console.log true.

Mit dem polyfill von zone.js

, die von der Form ist:

Object.defineProperties = function (obj, props) { 
    Object.keys(props).forEach(function (prop) { 
     Object.defineProperty(obj, prop, props[prop]); 
    }); 
    return obj; 
    }; 

wir für den gleichen Code von console.log undefined bekommen.

Dies liegt an der Funktion Object.keys. Ich habe gegoogelt und nirgendwo gefunden, ob das erlaubt sein sollte oder nicht.

+2

Syntaktisch ist es gültig, praktisch ist es wie jeder andere Objektschlüssel in eine Zeichenkette umgewandelt wird, wie 'Symbol()' (das wäre in diesem Fall der genaue Schlüsselname). Wenn Sie wirklich nach einem beliebigen Objekt einen Schlüssel eingeben wollen - benutzen Sie die ES2015 'Map()' – zerkms

+0

Uh, definieren Sie hier keine Eigenschaft ** auf **? – Bergi

Antwort

1

Ich googelte herum und fand nirgendwo, ob dies erlaubt sein sollte oder nicht.

Sie können immer die Spezifikation überprüfen, in diesem Fall § 19.1.2.3 Object.defineProperties(O, Properties).

Es verwendet die OwnPropertyKeys internal method, die tatsächlich alle String- und Symbolschlüssel eines Objekts auflistet.

Dies ist wegen der Object.keys Funktion

Richtig. Es sollte stattdessen Object.getOwnPropertyNames(props).concat(Object.getOwnPropertySymbols(props)) sein. Vielleicht möchten Sie einen Fehler mit zone.js einreichen. Ich frage mich jedoch, warum Sie ein Polyfill für die ES5 Object.defineProperties Funktion benötigen, wenn Sie mit ES6-Symbolen arbeiten?

+0

Aber das Polyfill sollte nicht in einer ES6-Umgebung angewendet werden, in der 'Object.defineProperties' bereits nativ definiert ist? – Bergi

+0

das sieht gut aus –

Verwandte Themen