javascript

位置:IT落伍者 >> javascript >> 浏览文章

JS判定是否原生方法


发布日期:2020年02月12日
 
JS判定是否原生方法
这篇文章介绍了js判定是否原生方法有需要的朋友可以参考一下

浏览器的趋势是加入越来越多对象像Worker同时也为旧有的对象添加新方法如何兼容它的第一步就是检测它们是否存在没有则补上自己的兼容代码 这时问题就来了有的类库是给你做了这一步但有时没有有时是做了但并不符合标准因此单纯是typeof Arrayprototypemap  === "function"可能不够用这时isNative方法就要登场了
我一直用的版本自己写的

复制代码 代码如下:
var isNative = function(method){//判定是否为原生方法
return !! method && (/{s*[native code]s*}/test(method+"") ||
/{s*/* source code not available */s*}/test(method+""));//这里是为了兼容operax的
}


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

复制代码 代码如下:
var isNative = function(object method) {
return object && method in object &&
typeof object[method] != string &&
// IE & WC browser return "[native code]"
// Safari < = will return "[function]"
(/{s*[native code]s*}|^[function]$/)test(object[method]);
}


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

复制代码 代码如下:
windowtest = {
toString: function() {
return [function];
}
};


isNative(window test); // true
最后我从nwmathers中找到这个

复制代码 代码如下:


var isNative = (function() {
var s = (windowopen + )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 ));
};
})();

               

上一篇:js判断背景图片是否加载成功使用img的width实现

下一篇:JS特效代码--仿windows xp左侧菜单效果