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 相关文章推荐
Code:findPosX 和 findPosY
Dec 20 Javascript
javascript实现的动态添加表单元素input,button等(appendChild)
Nov 24 Javascript
javascript encodeURI和encodeURIComponent的比较
Apr 03 Javascript
javascript简单事件处理和with用法介绍
Sep 16 Javascript
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
Mar 07 Javascript
JavaScript实现复制内容到粘贴板代码
Mar 31 Javascript
JS 实现 ajax 异步浏览器兼容问题
Jan 21 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
Aug 18 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
Nov 15 Javascript
在Vue中使用antv的示例代码
Jun 29 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
Aug 06 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微信浏览器分享设置以及回调详解
2016/08/01 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
layui表格数据重载
2019/07/27 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
Python生成数字图片代码分享
2017/10/31 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
django允许外部访问的实例讲解
2018/05/14 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
利用python循环创建多个文件的方法
2018/10/25 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
python mysql中in参数化说明
2020/06/05 Python
Django静态文件加载失败解决方案
2020/08/26 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
机电专业体育教师求职信
2013/09/21 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫