代码描述:js判断 是内置或自定义。js判断是内置或自定义代码下载
可能在实际应用中有这样的需求,判断一个方法是JavaScript内置的,还是自定义的。 当然这样的需求并不多,下面就通过代码示例做一下介绍,先看一段代码示例:
<script> console.log(alert.toString()); </script>
内置的方法会隐藏内部实现,会显示上图所示的内容,所以利用这个特点就可以实现简单的判断功能。 代码如下:
<script> function isNative(fn) { return (/\\{\\s*\\[native code\\]\\s*\\}/).test('' + fn); } console.log(isNative(alert)); </script>
特别说明:上面的代码依然无法再本编辑器中正常测试,需要在本机进行测试。 ''+fn的作用是将函数隐式转换为字符串,和fn.toString()效果一样。 上面的代码比较简单,还有一位大神写的比较完美的代码,也可以实现此功能,感兴趣的朋友可以自行做一下分析。 代码如下:
<script> ;(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; }()); </script>
请绑定手机号,在继续操作
注意:只有绑定手机以后,才可使用网站全部功能