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

我总是经常碰到需要检查某个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
(0)

相关推荐

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

    我总是经常碰到需要检查某个function是否是原生代码的情况 -- 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的.要检测这一点,最简单的办法当然是判断函数的 toString 方法返回的值啦. JavaScript代码 判断函数是否是原生方法其实相当简单: // 判断是否原生函数 function isNative(fn) { // 示例: // alert.toString() // "function alert() { [native code] }

  • JavaScript中判断原生函数检查function是否是原生代码

    我总是经常碰到需要检查某个function是否是原生代码的情况 -- 这是功能测试中一个很重要的内容: 函数是浏览器内置支持的,还是通过第三方类库模拟的.要检测这一点,最简单的办法当然是判断函数的 toString 方法返回的值啦. JavaScript代码 判断函数是否是原生方法其实相当简单: // 判断是否原生函数 function isNative(fn) { // 示例: // alert.toString() // "function alert() { [native code] }

  • JavaScript检查数字是否为整数或浮点数的方法

    本文实例讲述了JavaScript检查数字是否为整数或浮点数的方法.分享给大家供大家参考.具体如下: 检查是否为整数: function isInt(n) { return typeof n === 'number' && n % 1 == 0; } // or ,this support ie3 function isInt(n) { return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) &

  • JavaScript检查子字符串是否在字符串中的方法

    本文实例讲述了JavaScript检查子字符串是否在字符串中的方法.分享给大家供大家参考,具体如下: var strnew="Hello Raghu How are u" //Checking existence in entire string if(strnew.indexOf("Raghu") != -1 ) { alert("Exists"); } /* Checking existence at the end of string Fo

  • javaScript和jQuery自动加载简单代码实现方法

    在此之前我们给大家整理过用javaScript和jQuery自动加载的几种方法,大家可以参考一下:javaScript 页面自动加载事件详解 一.JavaScript自动加载 ①在文本中用onload: 当页面中所有内容(包括图片)加载完后再执行onload,如下: <body onload="alert(1)"></body> <!-- 当有一个onload --> <body onload="alert(2);alert(3);a

  • Flutter调用Android和iOS原生代码的方法示例

    前言 本文主要给大家介绍了关于Flutter调用Android和iOS原生代码的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 分3个大步骤: 1.在flutter中调用原生方法 2.在Android中实现被调用的方法 3.在iOS中实现被调用的方法 在flutter中调用原生方法 场景,这里你希望调用原生方法告诉你一个bool值,这个值的意义你可以随意定,这里表示的意义是是否是中国用户. 你可以在flutter中设计好要调用的方法名称,这里就叫 isChinese 请

  • JavaScript检查弹出窗口是否被阻拦的方法技巧

    出框口很有用,需要弹出窗口.对于开发这样的网站的程序员,他们有个棘手的问题,他们不知道这些弹出窗口是否被浏览器或各种浏览器插件给屏蔽了,没有弹出来.当然,浏览器会通知用户,但这些很少会引起用户的注意.下面是一个简单的方法来测试你的弹出窗口是否被阻拦了. The JavaScript 复制代码 代码如下: var windowName = 'userConsole'; var popUp = window.open('/popup-page.php', windowName, 'width=100

  • JavaScript之事件委托实例(附原生js和jQuery代码)

    事件委托的原理依赖于事件冒泡,可以通过给父元素的事件委托来确定是哪个子元素触发了事件从而做一系列操作. 使用事件委托的优点 1.操作子元素时不用一一遍历,可以根据事件触发的对象而进行相应操作 dom结构如下: <ul id = "oUl"> <li class = "item"></li> <li class = "item"></li> <li class = "ite

  • 原生JavaScript实现滑动拖动验证的示例代码

    本文介绍了原生JavaScript实现滑动拖动验证的示例代码,分享给大家,具体如下: 通常,我们为了防止用户恶意提交表单,会让用户在提交前完成滑动拖动验证,有时候这也能起到一丝反爬的作用. 实现滑动验证的方式当然不止一种,这里我们直接使用原生 JavaScript 来实现. 现在,你可以在这里 看到完整的源码. 原生实现 原生 JavaScript 的实现,主要是通过监听鼠标事件来对 DOM 进行一系列的操作. 滑块验证的结构主要分为四个部分:轨道.滑块.背景和文案,我们可以使用下面的 HTML

  • javascript检查浏览器是否支持flash的实现代码

    javascript检查浏览器是否支持flash,程序输出结果: <script> function flashChecker() { var hasFlash = 0; //是否安装了flash var flashVersion = 0; //flash版本 if (document.all) { var swf = new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); if (swf) { hasFlash = 1; VSwf = swf.

随机推荐