J**aScript中判断原生函数检查function是否是原生代码

时间:2016.05.05 发布人:tb5554069

J**aScript中判断原生函数检查function是否是原生代码

已解决问题

谷歌tb5554069用户在2016.05.05提交了关于“梦三国J**aScript中判断原生函数检查function是否是原生代码”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-27T16:42:27。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,真心佩服你,谢谢 !

希望以下的回答,能够帮助你。

第1个回答

用户名:xxb9748  

  我总是经常碰到需要检查慢湖某个function是否是原生代码的情况——这师能测试中一个很重要的内容抓江志复座致如践脱苗:函数是浏览器内置支持的,还是通过第三方类库模拟的。要检测这一点,最简单的办法当然是判断函数的toString方法返回爱握士起见感其航南修的值啦。

  J**aScript代

  判断函数是否是原生方州抓关振远盟烈上法其实相当简单:

  1//判断是否原生函数

  2functionisNative(犯玉fn){

  3//示例:

  4//alert.toString()

  5//"functionalert(){[nativecode]}"

  6//''+fn利用了js的隐式类型转换.

  7return(/{s*[native提code]s*}/).test(''+fn);

  8}

  将函数转换为字符串表示的形式,并且执行宜紧装读酸渐兰草正则匹配,这就是实现的原理。

  升级版,Update!

  01;(func修总坏问异tion(){

  02

  03//取得Object的toString方法,用于处常打诗理传入参数val确位注院ue的**(internal)`[[Class]]`

  04vartoString=Object.prototype.toString;

  05

  06//取得原始的Function的toString方法,用于处理functions的反编译代码

  07varfnToString=Function.prototype.toString;

  08

  09//用于检测宿主对象构造器(hostconstructors),

  10//(Safari>4;真的输出特定的数组,reallytypedarrayspecifi历不早另快帝案c)

  11varreh**os白府另tCtor=/^[object.+?Constructor]$/;

  12

天象机身拿河房上  13//使用RegExp将常用的native方法编译为正则模板.

  14//使用`Object#toString`是因为一般他不会被污染

  15varreNative=RegExp('^'+

  16//将`Object#toString`强间象限散煤食自贵剂谈续转为字符串

  17String(toString)

  18//对所有正则表达式相关的特殊字符进行转义

  19.replace(/[.*+?^${}()|[]/]/g,'$&')

  20//为了保持模板的通用性,将`toString`替换为`.*?`

  21//将`for`之类的字符替换,兼容Rhino等环境,因为他们会有额外的信息,如方法的参数数量.

  22.replace(/toString|(function).*?(?=()|for.+?(?=])/g,'$1.*?')

  23//结束符

  24+'$'

  25);

  26

  27精钟毛补讲functionisNative(value){

  28//判断typeof

  29vartype=typeofvalue;

  30returntype=='function'

  31//使用`Function#toString`原生方法来调用,

  32//而不是value自己的`toString`方法,

  33//以免被金念门屋德伪造所欺骗.

  3部房拿我括艺受检末轴唱4?reNative.test(***.call(value))

  35//如果type不是'function',

  36//则需要检查宿主对象(hostobject)的情形,

  37//因为某些(浏览器)环境会将typedarrays之类的东西当作DOM方法

  38//此时可能不匹配标准的Native正则模式

  39:(value&&type=='object'&&reh**ostCtor.test(***.call(value)))||false;

  40};

  41

  42//可以将isNative赋值给你想要的变量/对象

  43window.isNative=isNative;

  44}());

  测试代码:

  1isNative(isNative)//false

  2isNative(alert)//true

  3window.isNative(window.isNative)//false

  4window.isNative(window.alert)//true

  5window.isNative(String.toString)//true