可能在实际应用中有这样的需求,判断一个方法是JavaScript内置的,还是自定义的。

当然这样的需求并不多,下面就通过代码示例做一下介绍,先看一段代码示例:
   [ bootstrap ] 运行代码    下载代码
<script>
console.log(alert.toString());
</script>
内置的方法会隐藏内部实现,会显示上图所示的内容,所以利用这个特点就可以实现简单的判断功能。

代码如下:
   [ bootstrap ] 运行代码    下载代码
<script>
function isNative(fn) { 
  return (/\\{\\s*\\[native code\\]\\s*\\}/).test('' + fn); 
}
console.log(isNative(alert));
</script>
特别说明:上面的代码依然无法再本编辑器中正常测试,需要在本机进行测试。

''+fn的作用是将函数隐式转换为字符串,和fn.toString()效果一样。

上面的代码比较简单,还有一位大神写的比较完美的代码,也可以实现此功能,感兴趣的朋友可以自行做一下分析。

代码如下:
   [ bootstrap ] 运行代码    下载代码
<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>

代码描述:js判断 是内置或自定义。js判断是内置或自定义代码下载



109 145



用户评论
大牛,别默默的看了,快登录帮我点评一下吧!:)      登录 | 注册



×
×
51前端

注册

×
绑定手机

请绑定手机号,在继续操作

×
单次下载支付

应付金额:279

支付完成后,回到下载页面,在进行下载

官方QQ群
意见反馈
qq群

扫描上面二维码加微信群

官方QQ群

jQuery/js讨论群
群号:642649996
Css3+Html5讨论群
群号:322131262

加群请备注:从官网了解到