JavaScript中判断原生函数检查function是否是原生代码
2014-09-09 16:04
639 查看
我总是经常碰到需要检查某个function是否是原生代码的情况 ―― 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的。要检测这一点,最简单的办法当然是判断函数的 toString 方法返回的值啦。
JavaScript代码
判断函数是否是原生方法其实相当简单:
// 判断是否原生函数 function isNative(fn) { // 示例: // alert.toString() // "function alert() { [native code] }" // '' + fn 利用了js的隐式类型转换. return (/\{\s*\[native code\]\s*\}/).test('' + fn); }
将函数转换为字符串表示的形式,并且执行正则匹配,这就是实现的原理。
升级版,Update!
;(function() { // 取得Object的toString方法,用于处理传入参数value的内部(internal) `[[Class]]` var toString = Object.prototype.toString; // 取得原始的Function的toString方法,用于处理functions的反编译代码 var fnToString = Function.prototype.toString; // 用于检测 宿主对象构造器(host constructors), // (Safari > 4; 真的输出特定的数组,really typed array specific) var reHostCtor = /^\[object .+?Constructor\]$/; // 使用RegExp将常用的native方法编译为正则模板. // 使用 `Object#toString` 是因为一般他不会被污染 var reNative = RegExp('^' + // 将 `Object#toString` 强转为字符串 String(toString) // 对所有正则表达式相关的特殊字符进行转义 .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&') // 为了保持模板的通用性,将 `toString` 替换为 `.*?` // 将`for ...`之类的字符替换,兼容Rhino等环境,因为他们会有额外的信息,如方法的参数数量. .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') // 结束符 + '$' ); function isNative(value) { // 判断 typeof var type = typeof value; return type == 'function' // 使用 `Function#toString`原生方法来调用, // 而不是 value 自己的 `toString` 方法, // 以免被伪造所欺骗. ? reNative.test(fnToString.call(value)) // 如果type 不是'function', // 则需要检查宿主对象(host object)的情形, // 因为某些(浏览器)环境会将 typed arrays 之类的东西当作DOM方法 // 此时可能不匹配标准的Native正则模式 : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false; }; // 可以将 isNative 赋值给你想要的变量/对象 window.isNative = isNative; }());
测试代码:
isNative(isNative) //false isNative(alert) //true window.isNative(window.isNative) //false window.isNative(window.alert) //true window.isNative(String.toString) //true
您可能感兴趣的文章:
- 浅谈JavaScript函数的四种存在形态
- JavaScript中判断函数、变量是否存在
- javascript版的in_array函数(判断数组中是否存在特定值)
- js 判断js函数、变量是否存在的简单示例代码
- Javascript 判断是否存在函数的方法
- JavaScript基于自定义函数判断变量类型的实现方法
- JS自定义函数对web前端上传的文件进行类型大小判断
- 判断数组是否包含某个元素的js函数实现方法
- JavaScript判断页面加载完之后再执行预定函数的技巧
- javascript判断css3动画结束 css3动画结束的回调函数
- JavaScript中判断变量是数组、函数或是对象类型的方法
- JavaScript判断变量是否为空的自定义函数分享
- JS简单判断函数是否存在的方法
相关文章推荐
- JavaScript中判断原生函数检查function是否是原生代码
- JavaScript检查某个function是否是原生代码的方法
- JavaScript检查某个function是否是原生代码的方法
- 原生javascript判断是否是移动端访问,跳转到手机端网址代码
- 判断页面是否被改动过的JavaScript代码
- 判断页面是否被改动过的JavaScript代码
- JavaScript判断输入是否为正整数、浮点数等数字的函数
- [函数]function CheckUrl(url: string): Boolean; //检查一个URL是否有效函数
- PHP 检查扩展库或函数是否可用的代码
- [转]用Javascript判断图片是否存在,不存在则显示默认图片的代码
- 用Javascript检查Adobe PDF插件是否安装的实现代码
- javascript下判断一个对象是否具有指定名称的属性的的代码
- 用javascript判断输入数据是否货币并自动添加¥符号的代码
- JavaScript检查表单是否为空的函数
- 用Javascript检查Adobe PDF插件是否安装的实现代码
- [函数]function CheckUrl(url: string): Boolean; //检查一个URL是否有效函数
- javascript中判断调用函数时候的参数个数是否和函数要求的一样
- 检查上传图片是否合法的函数,木马改后缀名、图片加恶意代码均逃不过
- javascript下判断一个元素是否存在的代码
- javascript下判断一个对象是否具有指定名称的属性的的代码