随手写系列--写一个类似Object.prototype.toString.call()判断方法

95 阅读1分钟

基本思路:--简单写了一下,第一手稿,没有优化 如果有实例标识符Symbol.toStringTag-直接返回--比如Map、Promise.resolve()

没有级抓构造类型--其实这里有点类似instanceof


function toStringFn(value) {
    this.value = value
    //如果有实例标识符Symbol.toStringTag-直接返回
    if (this.value[Symbol.toStringTag]) {
        return `[object,${this.value[Symbol.toStringTag]}]`
    } else {
        //没有的话,获取类型来进行构造输出
        let tree = {
            'function Array(': `[object,Array]`,
            'function Number(': `[object,Number]`,
            'function String(': `[object,String]`,
            'function Function(': `[object,Function]`,
            'class': (value) => `[object,${value}]`,
        }
        let typeArr = value.__proto__.constructor.toString().match(/function .+(\()/g)
        if (typeArr && typeArr[0]) {
            return tree[typeArr[0]]
        } else {

            let classExtendsArr = value.__proto__.constructor.toString().match(/class .+(extends)/g)
            if (classExtendsArr && classExtendsArr[0]) {
                return tree['class'](classExtendsArr[0].replace(/(class | extends)/g, ''))
            } else {
                let classArr = value.__proto__.constructor.toString().match(/class .+(\{)/g)
                if (classArr && classArr[0]) {
                    return tree['class'](classArr[0].replace(/[class |\{]/g, ''))
                }
            }
        }
    }
    return `[object,undefined]`

}
console.log(toStringFn(new Map()));
console.log(toStringFn([]));
console.log(toStringFn(123));

class Parent { }
class Child extends Parent { }
let c = new Child()
console.log(toStringFn(new Child()), toStringFn(new Parent()));

//输出
[object,Map]
[object,Array]
[object,Number]
[object,Child] [object,Prent]