检测一个函数是否是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 相关文章推荐
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
Sep 22 Javascript
JavaScript中的值类型转换介绍
Dec 31 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
Mar 13 Javascript
使用jQuery监听DOM元素大小变化
Feb 24 Javascript
jquery表单验证插件formValidator使用方法
Apr 01 Javascript
微信小程序 两种为对象属性赋值的方式详解
Feb 23 Javascript
详解angularJs指令的3种绑定策略
Apr 13 Javascript
浅谈node模块与npm包管理工具
Jan 03 Javascript
手把手带你封装一个vue component第三方库
Feb 14 Javascript
分享一个vue项目“脚手架”项目的实现步骤
May 26 Javascript
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
JavaScript实现班级抽签小程序
May 19 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
两个开源的Php输出Excel文件类
2010/02/08 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
JS获取表格内指定单元格html内容的方法
2015/03/31 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
python批量提取word内信息
2015/08/09 Python
Python中set与frozenset方法和区别详解
2016/05/23 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
python热力图实现简单方法
2021/01/29 Python
一套C#面试题
2013/10/09 面试题
出国留学介绍信
2014/01/13 职场文书
学校十一活动方案
2014/02/01 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
文案策划专业自荐信
2014/07/07 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
JavaScript的Set数据结构详解
2022/02/18 Javascript