更新 这是最终的工作代码——以防万一有人发现它有帮助:jsfiddle
我把它写成类型检测器。它在所有情况下都运行良好——到目前为止,无论我测试过什么,但仅在一种情况下失败。
首先,这是片段:jsfiddle
var TypeOf = function ( thing ) {
var typeOfThing = typeof thing;
if ( typeOfThing === 'object' ) {
typeOfThing = Object.prototype.toString.call(thing);
if ( typeOfThing === '[object Object]') {
if ( thing.constructor.name )
typeOfThing = thing.constructor.name;
else if ( thing.constructor.toString().charAt(0) === '[' )
typeOfThing = typeOfThing.substring(8,typeOfThing.length - 1);
else
typeOfThing = thing.constructor.toString().match(/function\s*(\w+)/)[1];
} else {
typeOfThing = typeOfThing.substring(8,typeOfThing.length - 1);
}
return typeOfThing.toLowerCase();
} else {
return typeOfThing;
}
}
问题是,如果我在 parse-time
定义函数,那么它将完美地工作:
function me () {};
var you = new me();
console.log('Type of you: ' + TypeOf(you)); // me
但是,如果我只是在运行时
定义它,那么它不会工作:
var me = function () {};
var you = new me();
console.log('Type of you: ' + TypeOf(you)); // nope
据我所知,在解析时的情况下,constructor
类似于 function me () {}
,因此我可以使用 获取它/function\s*(\w+)/
,但是在运行时情况下,构造函数是 function () {}
。
有什么办法可以让它发挥作用吗?此外,还有其他情况表明此代码段可能无法检测到类型吗?
更新为@lonesomeday评论中提到,似乎我正在尝试获取匿名函数的名称。这对我来说看起来有点可怕。这可能吗?
更新为@jackson下面说了,好像正确的输出应该是function
而不是me
。这真的是正确的吗?
最佳答案
您的测试实际上成功了。该变量的类型确实是“函数”。
考虑到您的 function me () {};
在您的测试中的并列,您似乎已经预料到附近的语法略有修改的测试会产生类似的结果。但这种情况并非如此。 you
没有理由拥有“我”的“类”(实际上不是类)。它只是一个常规的旧“函数”,仅此而已。
关于javascript - 获取对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440498/