php原生判断,JavaScript中判断原生函数检查function是否是原生代码_javascript技巧

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

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值