JavaScript检查某个function是否是原生代码的方法


Posted in Javascript onAugust 20, 2014

我总是经常碰到需要检查某个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 SHA-1:Secure Hash Algorithm
Dec 20 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
Nov 30 Javascript
javascript+iframe 实现无刷新载入整页的代码
Mar 17 Javascript
artDialog双击会关闭对话框的修改过程分享
Aug 05 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
Aug 04 Javascript
常用的JavaScript WEB操作方法分享
Feb 28 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
Oct 28 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
May 20 Javascript
Javascript中的arguments对象
Jun 20 Javascript
js仿淘宝评价评分功能
Feb 28 Javascript
Vue v-text指令简单使用方法示例
Sep 19 Javascript
原生js实现照片墙效果
Oct 13 Javascript
使用时间戳解决ie缓存的问题
Aug 20 #Javascript
js中使用replace方法完成某个字符的转换
Aug 20 #Javascript
js 动态修改css文件用到了cssRule
Aug 20 #Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
Aug 20 #Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 #Javascript
javascript对中文按照拼音排序代码
Aug 20 #Javascript
JS辨别访问浏览器判断是android还是ios系统
Aug 19 #Javascript
You might like
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
python开启debug模式的方法
2019/06/27 Python
Python PIL图片添加字体的例子
2019/08/22 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
模范家庭事迹材料
2014/02/10 职场文书
中班上学期幼儿评语
2014/04/30 职场文书
课程设计的心得体会
2014/09/03 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
2015年教研组工作总结
2015/05/04 职场文书
小学生读书笔记
2015/07/01 职场文书
中秋节随笔
2015/08/15 职场文书
运动会200米广播稿
2015/08/19 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书