JavaScript:区分本机成员和非本机成员

时间:2011-07-20 21:28:40

标签: javascript function

有没有办法检测给定的函数(例如Array.prototype.forEach)是本机函数(例如浏览器是否实现ECMAScript5)还是由页面的JavaScript脚本添加的函数?

6 个答案:

答案 0 :(得分:1)

您可以尝试将其放入控制台并查看其中的内容。

答案 1 :(得分:1)

我会说:警告(功能);

如果它弹出“本机代码”,则它是本机代码......

答案 2 :(得分:1)

利用本机方法的可枚举属性。

function isNative(prop){
    var op= this.prototype;
    if(prop in op){
        for(var p in op){
            if(p=== prop){
                return false;
            }
        }
        return true
    }
    return null;
}
isNative.call(Array, 'map');

答案 3 :(得分:0)

这使用的技术似乎适用于我尝试过的浏览器(虽然我不认为它是由标准指定的):

function checkMethodType(m) {
    if (!m) {
        return("doesn't exist");
    } else if (m.toString().search(/\[native code\]/) != -1) {
        return("native");
    } else {
        return("non-native");
    }
}

checkMethodType(Array.prototype.forEach);    // native in modern browsers
checkMethodType(Array.prototype.myMethod);   // non-native

jsFiddle这里:http://jsfiddle.net/jfriend00/GJJqQ/

此技术不标准,不保证可靠。实际上,如果你想通过将[native code]字符串放在非本机方法中,你可以欺骗它。但是,它可能会有用,取决于你想要它。我不知道任何100%可靠的方法。

答案 4 :(得分:0)

对于那些提出“本地代码”方法的人:

function Foo() {}
Foo.prototype.toString = function() {
  return 'function slice() {\n    [native code]\n}';
}

var foo = new Foo();
alert(foo);

/* Shows:
**   function Array() {
**       [native code]
**   }
*/

某些浏览器还会为主机对象添加短语“本机代码”。

Als,根据ECMA-262§4.3.6:

  

原生对象

     

ECMAScript实现中的对象     语义完全由本规范定义,而不是由     主持人环境。

     

注意本规范中定义了标准本机对象。一些   本机对象是内置的;其他人可能会在期间建造   执行ECMAScript程序的过程。

因此,如果用户代码添加了 Array.prototype.forEach 方法,则 是本机对象。也许OP真正意味着内置方法。

答案 5 :(得分:0)

这并不完美,但几乎尽可能接近。我相信Opera(?某些版本?)不能正确支持Function的反编译,也不支持Opera移动版。你打电话给你想做的事。它也避免了RobG的邪恶hackery。

function isNative(obj){
  var toString = obj.toString;
  delete obj.toString;
  var ret =  obj.toString().match(/\s*function\s+([a-z0-9]+)\s*\(\s*\)\s*{\s*\[native code\]/i)
  obj.toString = toString;
  return ret;
} 

它还返回函数名称,例如

 isNative(window.Array)[1] = "Array"