JavaScript中判断原生函数检查function是否是原生代码


Posted in Javascript onSeptember 09, 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操作input type=radio的实现代码
Jun 14 Javascript
动态创建script标签实现跨域资源访问的方法介绍
Feb 28 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
Apr 16 Javascript
jQuery学习笔记之回调函数
Aug 15 Javascript
浅析Ajax语法
Dec 05 Javascript
JS如何生成一个不重复的ID的函数
Dec 25 Javascript
学习使用Bootstrap页面排版样式
May 11 Javascript
帝国cms首页列表页实现点赞功能
Oct 30 Javascript
js 毫秒转天时分秒的实例
Nov 17 Javascript
layui前端框架之table表数据的刷新方法
Aug 17 Javascript
解决vue点击控制单个样式的问题
Sep 05 Javascript
JS如何监听div的resize事件详解
Dec 03 Javascript
三种取消选中单选框radio的方法
Sep 09 #Javascript
使用JQuery库提供的扩展功能实现自定义方法
Sep 09 #Javascript
JQuery 给元素绑定click事件多次执行的解决方法
Sep 09 #Javascript
一个实用的图片切换支持点击切换和自动轮播
Sep 09 #Javascript
用JavaScript实现用一个DIV来包装文本元素节点
Sep 09 #Javascript
点击button获取text内容并改变样式的js实现
Sep 09 #Javascript
js 数组去重的四种实用方法
Sep 09 #Javascript
You might like
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
使用php显示搜索引擎来的关键词
2014/02/13 PHP
event对象的方法 兼容多浏览器
2009/06/27 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
require.js中的define函数详解
2017/07/10 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
js实现简易计算器功能
2019/10/18 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
python网络编程示例(客户端与服务端)
2014/04/24 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
会计毕业生自荐信
2013/11/21 职场文书
校班主任推荐信范文
2013/12/03 职场文书
项目资料员岗位职责
2013/12/10 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
大学生村官考核材料
2014/05/23 职场文书
先进事迹演讲稿
2014/09/01 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
Python 使用dict实现switch的操作
2021/04/07 Python
python基于tkinter制作下班倒计时工具
2021/04/28 Python
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS