检测一个函数是否是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 相关文章推荐
用js实现上传图片前的预览(TX的面试题)
Aug 14 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
Mar 15 Javascript
jquery submit ie6下失效的原因分析及解决方法
Nov 15 Javascript
容易造成JavaScript内存泄露几个方面
Sep 04 Javascript
javascript实现表格排序 编辑 拖拽 缩放
Jan 02 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
Sep 24 Javascript
jQuery自定义滚动条完整实例
Jan 08 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
Nov 04 Javascript
JS改变页面颜色源码分享
Feb 24 Javascript
Vue.js轮播图走马灯代码实例(全)
May 08 Javascript
jQuery HTML获取内容和属性操作实例分析
May 20 jQuery
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
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开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
出国签证在职证明
2014/01/16 职场文书
老公爱的承诺书
2014/03/31 职场文书
运动员口号
2014/06/09 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
房产公证书
2015/01/23 职场文书
介绍信格式样本
2015/05/05 职场文书
道歉的话怎么说
2015/05/12 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书
你真的会用Mysql的explain吗
2022/03/31 MySQL