检测一个函数是否是JavaScript原生函数的小技巧


Posted in Javascript onMarch 13, 2015

在我的开发工作中经常会遇到需要判断一个函数是否是JavaScript原生函数的情况,有时候这是一个很必要的工作,你需要知道这个函数是浏览器自身提供的,还是由第三方封装、伪装成原生函数。当然,最好的方法是考察执行这个函数的toString方法的返回值。

The JavaScript

完成这个任务的方法非常简单:

function isNative(fn) {

 return (/\{\s*\[native code\]\s*\}/).test('' + fn);

}

toString方法会返回这个方法的字符串形式,然后用正则表达式判断里面包含的字符。

更强悍的方法

Lodash的创始人John-David Dalton找到了一个更佳的方案:

;(function() {
  // Used to resolve the internal `[[Class]]` of values

  var toString = Object.prototype.toString;

  

  // Used to resolve the decompiled source of functions

  var fnToString = Function.prototype.toString;

  

  // Used to detect host constructors (Safari > 4; really typed array specific)

  var reHostCtor = /^\[object .+?Constructor\]$/;
  // Compile a regexp using a common native method as a template.

  // We chose `Object#toString` because there's a good chance it is not being mucked with.

  var reNative = RegExp('^' +

    // Coerce `Object#toString` to a string

    String(toString)

    // Escape any special regexp characters

    .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&')

    // Replace mentions of `toString` with `.*?` to keep the template generic.

    // Replace thing like `for ...` to support environments like Rhino which add extra info

    // such as method arity.

    .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'

  );

  

  function isNative(value) {

    var type = typeof value;

    return type == 'function'

      // Use `Function#toString` to bypass the value's own `toString` method

      // and avoid being faked out.

      ? reNative.test(fnToString.call(value))

      // Fallback to a host object check because some environments will represent

      // things like typed arrays as DOM methods which may not conform to the

      // normal native pattern.

      : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;

  }

  

  // export however you want

  module.exports = isNative;

}());

现在你也看到了,很复杂,但更强大。当然,这不是为了做安全防护,它只是给你提供是否是原生函数的相关信息。
Javascript 相关文章推荐
Extjs学习笔记之七 布局
Jan 08 Javascript
jQuery之ajax删除详解
Feb 27 Javascript
AngularJS入门教程(一):静态模板
Dec 06 Javascript
jQuery中before()方法用法实例
Dec 25 Javascript
JavaScript监听和禁用浏览器回车事件实例
Jan 31 Javascript
JavaScript数据结构和算法之二叉树详解
Feb 11 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
May 05 Javascript
xcode中获取js文件的路径方法(推荐)
Nov 05 Javascript
jquery实现焦点轮播效果
Feb 23 Javascript
详解vue-router传参的两种方式
Sep 10 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
Nov 26 Javascript
javascript对象3个属性特征
Nov 17 Javascript
DOM操作一些常用的属性汇总
Mar 13 #Javascript
JavaScript获取页面上被选中文字的方法技巧
Mar 13 #Javascript
jQuery源码分析之Callbacks详解
Mar 13 #Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
Mar 13 #Javascript
Javascript定义类(class)的三种方法详解
Mar 13 #Javascript
JavaScript中5种调用函数的方法
Mar 12 #Javascript
JavaScript实现的一个倒计时的类
Mar 12 #Javascript
You might like
消息持续发送的完整例子
2006/10/09 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
Python中的自定义函数学习笔记
2014/09/23 Python
python使用socket连接远程服务器的方法
2015/04/29 Python
python实现按长宽比缩放图片
2018/06/07 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
文科毕业生自荐书范文
2014/04/17 职场文书
保险公司开门红口号
2014/06/21 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
爱国主义电影观后感
2015/06/18 职场文书
同意转租证明
2015/06/24 职场文书