如何检测一个函数是否是JavaScript原生函数
程序员文章站
2022-03-04 22:24:13
...
在我的开发工作中经常会遇到需要判断一个函数是否是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基础教程》
以上就是如何检测一个函数是否是JavaScript原生函数的详细内容,更多请关注其它相关文章!
推荐阅读
-
ASP.NET中如何检测一个图片是否是真实图片 防范病毒上传
-
javascript原生封装一个淡入淡出效果的函数测试实例代码
-
完美的2个php检测字符串是否是utf-8编码函数分享
-
从一个存储过程说说mysql中日期函数的参数是否必须是日期格式
-
leecode-1 给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n =3x
-
asp下的一个检测链接是否正常的函数
-
javascript - PHP如何判断一个请求是否来源于本域并且是ajax请求?
-
php 如何检测一个数据库字段是否是唯一的
-
javascript - 被这个算法迷住了,如何获得一个加密函数?
-
完美的2个php检测字符串是否是utf-8编码函数分享,字符串utf-8_PHP教程