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 相关文章推荐
一个cssQuery对象 javascript脚本实现代码
Jul 21 Javascript
浅析LigerUi开发中谨慎载入common.css文件
Jul 09 Javascript
Jquery读取URL参数小例子
Aug 30 Javascript
javascript实现的一个带下拉框功能的文本框
May 08 Javascript
javascript属性访问表达式用法分析
Apr 25 Javascript
window.location.hash知识汇总
Nov 09 Javascript
Bootstrap学习笔记之环境配置(1)
Dec 07 Javascript
javascript表达式和运算符详解
Feb 07 Javascript
详解redux异步操作实践
Aug 15 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
Dec 12 Javascript
jQuery实现tab栏切换效果
Dec 22 jQuery
JS前端使用Canvas快速实现手势解锁特效
Sep 23 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
Python自定义简单图轴简单实例
2018/01/08 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
python求解汉诺塔游戏
2020/07/09 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
JMS中Topic和Queue有什么区别
2013/05/15 面试题
思想品德自我鉴定
2013/10/12 职场文书
洗煤厂厂长岗位职责
2014/01/03 职场文书
20年同学聚会感言
2014/02/03 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
同学聚会开幕词
2019/04/02 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
React Native项目框架搭建的一些心得体会
2021/05/28 Javascript