JS判定是否原生方法

 更新时间:2013年07月22日 11:02:39   作者:  
这篇文章介绍了js判定是否原生方法,有需要的朋友可以参考一下
浏览器的趋势是加入越来越多对象,像Worker,同时也为旧有的对象添加新方法。如何兼容它的第一步就是检测它们是否存在,没有则补上自己的兼容代码。这时问题就来了,有的类库是给你做了这一步,但有时没有,有时是做了,但并不符合标准。因此单纯是typeof Array.prototype.map === "function"可能不够用。这时isNative方法就要登场了。
我一直用的版本,自己写的:
复制代码 代码如下:

var isNative = function(method){//判定是否为原生方法 
      return !! method && (/{s*[native code]s*}/.test(method+"") || 
          /{s*/* source code not available */s*}/.test(method+""));//这里是为了兼容opera9.x的 
  }

但世界这么大,肯定也有研究过这问题,下面是Diego Perini的版本,指出safari对原生方法的toString值其实也是个不合群的:
复制代码 代码如下:

var isNative = function(object, method) { 
    return object && method in object && 
      typeof object[method] != string && 
      // IE & W3C browser return "[native code]" 
      // Safari < = 2.0.4 will return "[function]" 
      (/{s*[native code]s*}|^[function]$/).test(object[method]); 
  }

它比我的版本多一个参数,能指定是那个原生对象的方法,但一个参数与两个参数是没关系的,结果只是表明,我们俩离完美还有段距离。即使这两个函数取并集,可能还不是正确的全集。
当然这不是[native code]或者 source code not available还是[function]的问题,因为要javascript中,很容易山寨各种方法与对象。如,下面的代码就可以成功骗过检测代码。
复制代码 代码如下:

window.test = { 
  toString: function() { 
    return [function]; 
  } 
}; 

isNative(window, test); // true
最后我从nwmathers中找到这个:
复制代码 代码如下:

var isNative = (function() { 
   var s = (window.open + ).replace(/open/g, ); 
   return function(object, method) { 
     var m = object ? object[method] : false, r = new RegExp(method, g); 
     return !!(m && typeof m != string && s === (m + ).replace(r, )); 
   }; 
 })();

相关文章

  • JavaScript之Canvas_动力节点Java学院整理

    JavaScript之Canvas_动力节点Java学院整理

    这篇文章主要介绍了JavaScript之Canvas,Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表、动画等
    2017-07-07
  • 无阻塞加载脚本分析[全]

    无阻塞加载脚本分析[全]

    script标签的阻塞行为会对页面性能产生负面影响,大多数浏览器在下载或执行脚本的同时,会阻塞下载位于它之后的资源,也会阻塞渲染位于它之后的元素。
    2011-01-01
  • jsonp格式前端发送和后台接受写法的代码详解

    jsonp格式前端发送和后台接受写法的代码详解

    jsonp是ajax提交的一种格式不会受跨域限制,这篇文章主要介绍了jsonp格式前端发送和后台接受写法的代码详解,需要的朋友可以参考下
    2019-11-11
  • 微信小程序开发之路由切换页面重定向问题

    微信小程序开发之路由切换页面重定向问题

    这篇文章主要介绍了微信小程序开发之路由切换页面重定向问题,又通过实例代码给大家介绍了微信小程序的路由跳转方法,需要的朋友可以参考下
    2018-09-09
  • 使用tree shaking 移除无用代码

    使用tree shaking 移除无用代码

    这篇文章主要为大家介绍了使用tree shaking 移除无用代码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • js前端传json后台接收‘‘被转为quot的问题解决

    js前端传json后台接收‘‘被转为quot的问题解决

    这篇文章主要介绍了js前端传json后台接收‘‘被转为&quot;的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • webpack proxy 使用(代理的使用)

    webpack proxy 使用(代理的使用)

    这篇文章主要介绍了webpack proxy 使用(代理的使用),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • javascript中自定义对象的属性方法分享

    javascript中自定义对象的属性方法分享

    这篇文章介绍了在javascript中自定义对象的属性方法,有需要的朋友可以参考一下
    2013-07-07
  • 解决layui checkbox 提交多个值的问题

    解决layui checkbox 提交多个值的问题

    今天小编就为大家分享一篇解决layui checkbox 提交多个值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • JavaScript与jQuery中文档就绪函数的区别

    JavaScript与jQuery中文档就绪函数的区别

    这篇文章主要介绍了JavaScript与jQuery中文档就绪函数的区别,文章内容介绍详细,具有一的的参考价值,需要的小伙伴可以参考一下
    2022-03-03

最新评论