有没有办法检测给定的函数(例如Array.prototype.forEach
)是本机函数(例如浏览器是否实现ECMAScript5)还是由页面的JavaScript脚本添加的函数?
答案 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"