基本思路:--简单写了一下,第一手稿,没有优化 如果有实例标识符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]