微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript检查某个function是否是原生代码的方法

我总是经常碰到需要检查某个function是否是原生代码的情况 —— 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的。要检测这一点,最简单的办法当然是判断函数的 toString 方法返回的值啦。

JavaScript代码

判断函数是否是原生方法其实相当简单:

rush:js;"> // 判断是否原生函数 function isNative(fn) { // 示例: // alert.toString() // "function alert() { [native code] }" // '' + fn 利用了js的隐式类型转换. return (/\{\s*\[native code\]\s*\}/).test('' + fn); }

函数转换为字符串表示的形式,并且执行正则匹配,这就是实现的原理。

升级版,Update!

// 取得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;
}());

rush:js;"> isNative(isNative) //false isNative(alert) //true window.isNative(window.isNative) //false window.isNative(window.alert) //true window.isNative(String.toString) //true

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高