core-js
Version:
Standard library
60 lines (57 loc) • 1.97 kB
JavaScript
// ECMAScript 6 symbols shim
!function(TAG, SymbolRegistry, setter){
// 19.4.1.1 Symbol([description])
if(!isNative(Symbol)){
Symbol = function(description){
assert(!(this instanceof Symbol), SYMBOL + ' is not a ' + CONSTRUCTOR);
var tag = uid(description);
setter && defineProperty(ObjectProto, tag, {
configurable: true,
set: function(value){
hidden(this, tag, value);
}
});
return set(create(Symbol[PROTOTYPE]), TAG, tag);
}
hidden(Symbol[PROTOTYPE], TO_STRING, function(){
return this[TAG];
});
}
$define(GLOBAL + WRAP, {Symbol: Symbol});
var symbolStatics = {
// 19.4.2.1 Symbol.for(key)
'for': function(key){
return has(SymbolRegistry, key += '')
? SymbolRegistry[key]
: SymbolRegistry[key] = Symbol(key);
},
// 19.4.2.4 Symbol.iterator
iterator: SYMBOL_ITERATOR,
// 19.4.2.5 Symbol.keyFor(sym)
keyFor: part.call(keyOf, SymbolRegistry),
// 19.4.2.13 Symbol.toStringTag
toStringTag: SYMBOL_TAG = getWellKnownSymbol(TO_STRING_TAG, true),
pure: safeSymbol,
set: set,
useSetter: function(){setter = true},
useSimple: function(){setter = false}
};
// 19.4.2.2 Symbol.hasInstance
// 19.4.2.3 Symbol.isConcatSpreadable
// 19.4.2.6 Symbol.match
// 19.4.2.8 Symbol.replace
// 19.4.2.9 Symbol.search
// 19.4.2.10 Symbol.species
// 19.4.2.11 Symbol.split
// 19.4.2.12 Symbol.toPrimitive
// 19.4.2.14 Symbol.unscopables
forEach.call(array('hasInstance,isConcatSpreadable,match,replace,search,' +
'species,split,toPrimitive,unscopables'), function(it){
symbolStatics[it] = getWellKnownSymbol(it);
}
);
$define(STATIC, SYMBOL, symbolStatics);
setToStringTag(Symbol, SYMBOL);
// 26.1.11 Reflect.ownKeys (target)
$define(GLOBAL, {Reflect: {ownKeys: ownKeys}});
}(safeSymbol('tag'), {}, true);