在Internet Explorer中未定义constructor.name

Ion*_*zău 12 javascript internet-explorer constructor object

我在IE浏览器调试工作今天结束的发现constructor.nameundefined.

我创建了以下简单的代码来重现问题:

({}).constructor.name === undefined // => true
Run Code Online (Sandbox Code Playgroud)

是否有任何解决方法可以使这项工作?

也许压倒一些原型?

如果可能,我不想更改语法,因为更改将是主要的.

的jsfiddle

小智 14

来自matt.scharley.me

/**
 * Hack in support for Function.name for browsers that don't support it.
 * IE, I'm looking at you.
**/
if (Function.prototype.name === undefined && Object.defineProperty !== undefined) {
    Object.defineProperty(Function.prototype, 'name', {
        get: function() {
            var funcNameRegex = /function\s([^(]{1,})\(/;
            var results = (funcNameRegex).exec((this).toString());
            return (results && results.length > 1) ? results[1].trim() : "";
        },
        set: function(value) {}
    });
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*own 12

问题很简单,nameInternet Explorer不支持函数对象的属性.该属性是非标准的(至少在ECMAScript 6之前),所以它并不令人惊讶.

没有完全可靠的解决方法,所以如果可能的话,我建议尝试不使用它.但是,您可以从函数的字符串表示中提取名称.我从快速搜索中得到了几个处理这个问题的链接:

更新

从评论中可以看出,问题作者的目标是测试变量是否是对Object构造函数创建的普通对象的引用.为变量执行此操作的可靠方法a

Object.prototype.toString.call(a) == "[object Object]"
Run Code Online (Sandbox Code Playgroud)

有关更多信息,我建议使用Angus Croll撰写的以下页面:

http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/