Javascript HasOwnProperty Polyfill
Javascript HasOwnProperty Polyfill
我知道这听起来像是一个荒谬、不必要的问题,但事实并非如此。
https://caniuse.com/?search=Hasownproperty 显示 100% 的跟踪桌面客户端支持,这符合您的预期。但是切换到跟踪的移动客户端显示支持率仅为 95.4%,这令人震惊,考虑到移动客户端与桌面客户端持平甚至超过桌面客户端,这意味着所有 当前 访问的客户端中约有 2.5% 的外推网页本身不支持 hasOwnProperty
。
鉴于包括 jQuery、Modernizr 和 Crockford 的 json2.js 引用 hasOwnProperty
在内的大量第三方库并没有对其进行 polyfill,因此 polyfill 确实非常重要.
我正在寻找一种根据规范进行 polyfill hasOwnProperty
的方法。它可以使用 for in
循环浅层填充(尽管不正确),但这不会 return false
用于继承属性。
的 polyfill 部分
这是实现
(function(w){
var isFunction=w.isFunction||(w.isFunction=function(x){return typeof(x)==='function'}),
has=w.has||(w.has=function(o,p){var e=p in o;return {value:e && (e=o[p]) && true,refer:e,valueOf:function(){return this.value}}}),
Polyfill=w.PolyfillMethod||(w.PolyfillMethod=function(o,p,x){var e=has(o,p);if(e && (e=isFunction(e.refer))===false){o[p]=x};return e}),
theProto=w.Object.prototype;
Polyfill(theProto,'hasOwnProperty',function(x){var o,e=this,p=String(x);return p in e && (o=e.__proto__||e.constructor.prototype,(p in o ===false)||e[p]!== o[p])});
})(window);
我知道这听起来像是一个荒谬、不必要的问题,但事实并非如此。
https://caniuse.com/?search=Hasownproperty 显示 100% 的跟踪桌面客户端支持,这符合您的预期。但是切换到跟踪的移动客户端显示支持率仅为 95.4%,这令人震惊,考虑到移动客户端与桌面客户端持平甚至超过桌面客户端,这意味着所有 当前 访问的客户端中约有 2.5% 的外推网页本身不支持 hasOwnProperty
。
鉴于包括 jQuery、Modernizr 和 Crockford 的 json2.js 引用 hasOwnProperty
在内的大量第三方库并没有对其进行 polyfill,因此 polyfill 确实非常重要.
我正在寻找一种根据规范进行 polyfill hasOwnProperty
的方法。它可以使用 for in
循环浅层填充(尽管不正确),但这不会 return false
用于继承属性。
这是实现
(function(w){
var isFunction=w.isFunction||(w.isFunction=function(x){return typeof(x)==='function'}),
has=w.has||(w.has=function(o,p){var e=p in o;return {value:e && (e=o[p]) && true,refer:e,valueOf:function(){return this.value}}}),
Polyfill=w.PolyfillMethod||(w.PolyfillMethod=function(o,p,x){var e=has(o,p);if(e && (e=isFunction(e.refer))===false){o[p]=x};return e}),
theProto=w.Object.prototype;
Polyfill(theProto,'hasOwnProperty',function(x){var o,e=this,p=String(x);return p in e && (o=e.__proto__||e.constructor.prototype,(p in o ===false)||e[p]!== o[p])});
})(window);