| // `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 |
| }); |
| } |