JS中亲手教你实现一个Symbol

(function(){
    
    const root = this;
    const generateName = (function(){
        let postfix = 0;
        return function(description){
            postfix+=1
            return `@@${description}_${postfix}`
        }
    })()

    const SymbolPolyfill = function(description){
        //判断有没有使用new操作符 
        if(this instanceof SymbolPolyfill) throw new TypeError("Symbol is not a constructor")

        const str = description==undefined?undefined:String(description)

        const symbol = Object.create( {
            toString(){
                return this.__Name__
            },
            valueOf(){
                // throw new Error('Cannot convert a Symbol value')
                return this
            }
        })

        Object.defineProperties(symbol,{
            "__Description__":{
                value:str,
                writable:false,
                enumerable:false,
                configurable:false
            },
            "__Name__":{
                value:generateName(str),
                writable:false,
                enumerable:false,
                configurable:false
            }
        })
        return symbol
    }

    let forMap = {}

    Object.defineProperties(SymbolPolyfill,{
        "for":{
            //这里传进去的是SYmbol的描述项
            value:function(description){
                let str = description===undefined?undefined:String(description)
                return forMap[str]?forMap[str]:forMap[str] = SymbolPolyfill(str)
            },
            enumerable:false,
            writable:true,
            configurable:true
        },
        "keyFor":{
            //这里是Symbol的声明值
            value:function(symbol){
                console.log(symbol)
                for(let key in forMap){
                    console.log(key)
                    if(forMap[key]===symbol) return key;
                }
            },
            enumerable:false,
            writable:true,
            configurable:true
        }
    })
    root.SymbolPolyfill = SymbolPolyfill
})()
var aa = SymbolPolyfill.for('aaaaa')
var bb = SymbolPolyfill.for('bbbb')

console.log(bb.valueOf())

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值