50 lines
2.1 KiB
JavaScript
50 lines
2.1 KiB
JavaScript
// `Symbol.prototype.description` getter
|
|
// https://tc39.github.io/ecma262/#sec-symbol.prototype.description
|
|
'use strict';
|
|
var $ = require('../internals/export');
|
|
var DESCRIPTORS = require('../internals/descriptors');
|
|
var global = require('../internals/global');
|
|
var has = require('../internals/has');
|
|
var isObject = require('../internals/is-object');
|
|
var defineProperty = require('../internals/object-define-property').f;
|
|
var copyConstructorProperties = require('../internals/copy-constructor-properties');
|
|
|
|
var NativeSymbol = global.Symbol;
|
|
|
|
if (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||
|
|
// Safari 12 bug
|
|
NativeSymbol().description !== undefined
|
|
)) {
|
|
var EmptyStringDescriptionStore = {};
|
|
// wrap Symbol constructor for correct work with undefined description
|
|
var SymbolWrapper = function Symbol() {
|
|
var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);
|
|
var result = this instanceof SymbolWrapper
|
|
? new NativeSymbol(description)
|
|
// in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'
|
|
: description === undefined ? NativeSymbol() : NativeSymbol(description);
|
|
if (description === '') EmptyStringDescriptionStore[result] = true;
|
|
return result;
|
|
};
|
|
copyConstructorProperties(SymbolWrapper, NativeSymbol);
|
|
var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;
|
|
symbolPrototype.constructor = SymbolWrapper;
|
|
|
|
var symbolToString = symbolPrototype.toString;
|
|
var native = String(NativeSymbol('test')) == 'Symbol(test)';
|
|
var regexp = /^Symbol\((.*)\)[^)]+$/;
|
|
defineProperty(symbolPrototype, 'description', {
|
|
configurable: true,
|
|
get: function description() {
|
|
var symbol = isObject(this) ? this.valueOf() : this;
|
|
var string = symbolToString.call(symbol);
|
|
if (has(EmptyStringDescriptionStore, symbol)) return '';
|
|
var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');
|
|
return desc === '' ? undefined : desc;
|
|
}
|
|
});
|
|
|
|
$({ global: true, forced: true }, {
|
|
Symbol: SymbolWrapper
|
|
});
|
|
}
|