type方法的封装

记一次type()方法的封装。要求能够判断出包装类。
首先我的思路是把对象和其他类型区分开来,因为实际上其他的数据类型都很好判断,使用Object.prototype.toString.call()就可以了。
在完成的过程中我出现了不少错误。
1.在对封装类进行判断时,我使用的是Object.constructor与所判断数据的constructor来进行比较的,到现在我也不知道是不是对的,但是我知道这个很不好的,因为Object.constructornative code(本地代码)
2.试图对Object.prototype.toString.call()使用简写名称时,我是这样写的

    toString = Object.prototype.toString.call() // one
    toString = Object.prototype.toString.call // two

不得不说都是糟糕的写法,特别是第一种,我只想引用这个toString方法,而加上一个小括号的话就是执行了,这是错的最离谱的。
至于two看起来的话好像好了一点,但是实际上还是错误的,只是去除了那个低端的错误,但是实际上我想使用的是Object的原型中的toString这个方法,而如果我向two那样写了的话,这个意思就是我将要调用的是那个toString对象(在JavaScript中一切都是对象嘛)中的call方法了
3.至于还有其他的错误那真是数不胜数了啊,但是我有点印象的错误就是以上那几个了,还有把实现代码贴在这里。
供以后鞭尸。。。。。?
4.还有一点要补充的。就是我一直以为对象原型的__proto__两边是一个下划线(话说我记得应该是没错的呀,难道是因为chrome更新了),然而这次用的时候发现实际上两边都是两个下划线。。。。

Object.prototype.type = function(obj) {
    obj = (arguments.length === 0) ? this : obj;
    //包装类不一样是对象么
    toString = Object.prototype.toString;
    console.log(toString.call(obj));
    if(typeof(obj) === "object") {
        return (obj.__proto__ === Object.prototype) ? "[object Object]" : `new ${toString.call(obj)}`;
    }
    else {
        return toString.call(obj);
    }
}
原文地址:https://www.cnblogs.com/freesfu/p/10113434.html