使用类型信息扩展对象原型

时间:2014-05-12 13:36:46

标签: javascript prototypal-inheritance typeof

我对内置的typeof方法感到有点沮丧,因为它没有很好地处理它的工作。向对象原型添加一个类型属性是一个坏主意,(如果是)为什么会这样?

Array.prototype.type = "Array";
Object.prototype.type = "Object";
Function.prototype.type = "Function";
String.prototype.type = "String";
Number.prototype.type = "Number";


function typeOf(obj) {
    if (!obj) return obj; // Returns undefined and null values.

    return obj.type;
}

2 个答案:

答案 0 :(得分:1)

你可以做这样的事情

function typeOf(inputArg) {
    if (!arguments.length) {
        throw new SyntaxError();
    }

    if (typeof inputArg === 'undefined') {
        return 'undefined';
    }

    if (inputArg === null) {
        return 'null';
    }

    return ({}.toString.call(inputArg).match(/\[object (Number|Boolean|String|Array|Object|Function)\]/) || ['Object']).pop().toLowerCase();
}

console.log(typeOf(undefined));
console.log(typeOf(null));
console.log(typeOf(1));
console.log(typeOf(true));
console.log(typeOf(''));
console.log(typeOf([]));
console.log(typeOf({}));
console.log(typeOf(function () {}));
console.log(typeOf(/a/));
console.log(typeOf());

输出

undefined
null
number
boolean
string
array
object
function
object
Uncaught SyntaxError 

jsFiddle

但是,旧浏览器中还存在一些其他错误,这些错误仍会导致不同的结果。这并没有考虑E4X XML内容,或者ECMA next中可能定义的任何新类型(尽管可能没什么新内容)。您还需要注意,这将识别原始对象,即new String('hello')string而不是object,这可能不是您想要的。因此,您需要仔细考虑您的需求或您想要实现的目标(我并不完全清楚)。

答案 1 :(得分:1)

如果你只是想找一种方法来测试类型&ludash' (可能'下划线')带来的功能可能会更符合您的喜好:

http://lodash.com/docs#isArray (以及所有其他_.is *函数)