JavaScript中判断原生函数检查function是否是原生代码
作者:bea
我总是经常碰到需要检查某个function是否是原生代码的情况 —— 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的。要检测这一点,最简单的办法当然是判断函数的 toString 方法返回的值啦。 JavaScript代码 判断函数是否是原生方法其实相当简单: // 判断是否原生函数 function isNative(fn) { // 示例: // alert.toString() // "function alert() { [na
我总是经常碰到需要检查某个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代码
判断函数是否是原生方法其实相当简单:
// 判断是否原生函数
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
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- Extjs grid panel自带滚动条失效的解决方法
- 用js传递value默认值的示例代码
- js图片实时加载提供网页打开速度
- jQuery 复合选择器应用的几个例子
- 使用js dom和jquery分别实现简单增删改
- sogou地图API用法实例教程
- 当前流行的JavaScript代码风格指南
- 在css加载完毕后自动判断页面是否加入css或js文件
- JQuery拖动表头边框线调整表格列宽效果代码
- jQuery通过点击行来删除HTML表格行的实现示例
- javascipt:filter过滤介绍及使用
- 用javascript将数据导入Excel示例代码
- js使用for循环及if语句判断多个一样的name
- JQuery实现当鼠标停留在某区域3秒后自动执行
- 鼠标悬浮停留三秒后自动显示大图js代码
- 使用typeof方法判断undefined类型
- jquery取子节点及当前节点属性值的方法
- jQuery CSS()方法改变现有的CSS样式表
- jQuery 浮动导航菜单适合购物商品类型的网站