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 相关文章推荐
jquery中对表单的基本操作代码
Jul 29 Javascript
js 获取浏览器版本以此来调整CSS的样式
Jun 03 Javascript
简介JavaScript中search()方法的使用
Jun 06 Javascript
JS随机调用指定函数的方法
Jul 01 Javascript
JavaScript实现自动消除按钮功能的方法
Aug 05 Javascript
JavaScript文档碎片操作实例分析
Dec 12 Javascript
ReactJs快速入门教程(精华版)
Nov 28 Javascript
详解本地Node.js服务器作为api服务器的解决办法
Feb 28 Javascript
Vue动态实现评分效果
May 24 Javascript
新手快速入门微信小程序组件库 iView Weapp
Jun 24 Javascript
Jquery如何使用animation动画效果改变背景色的代码
Jul 20 jQuery
Webpack5正式发布,有哪些新特性
Oct 12 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
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
jQuery中的常用事件总结
2009/12/27 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
Python下线程之间的共享和释放示例
2015/05/04 Python
Python3实现从指定路径查找文件的方法
2015/05/22 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
世界第一冲浪品牌:O’Neill
2016/08/30 全球购物
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
Linux上比较文件的命令都有哪些
2013/09/28 面试题
银行财务部实习生的自我鉴定
2013/11/27 职场文书
商务主管岗位职责
2013/12/08 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
Python爬取某拍短视频
2021/06/11 Python