美文网首页@IT·互联网
从moderlizr源码中学到的一些封装思想

从moderlizr源码中学到的一些封装思想

作者: Splendid飞羽 | 来源:发表于2021-04-15 20:37 被阅读0次

关于hasownProperty的封装

可能大家有些疑惑,这个方法不是浏览器支持的吗?其实不然 ,IE8就是另类,虽然现在很少用ie,但是一些政府机关类的网站ie还是占据主力,今天我们就来分析一下hasownProperty是如何兼容ie8的。
首先给出一个比较简单也是现在框架中常用的办法:

Object.hasOwnProperty.call(object, property);

这个方法使用到了Object的属性来检测,ie是支持的

接下里提供的一种方法就是modernizr这个库所特有的方法

方案一:使用({}).hasOwnProperty引出原生方法,然后调用

var _.hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
hasOwnProp = function(object, property){
        return _.hasOwnProperty.call(object, property);
}

利用({})调用对象的原生hasOwnProperty方法返回一个原生函数,然后传入对象和属性,好处是对于ie8而言,hasOwnProperty不支持会报错,但是包装对象({})的hasOwnProperty是支持的。

方案二:使用对象的in操作符,检测对象属性是否在对象及其原型链上,然后通过construtor指向对象的构造函数,再在其原型链上再次查找

var hasOwnProp = function(object, property){
        return (property in object) && !object.constructor.prototype[property]
}

在statckoverflow上也看到了一种答案,是对方法二的补充,增加了对象的proto内置属性

var hasOwnProperty = function(object, property){
      var proto = object.__proto__ || obj.constuctor.prototype;
     //对象object有可能是除了对象外其他数据类型
     return !(property in object) && (!(property in proto) || proto[property] !== object[property])
}

大家认为上面的代码可行吗?
此外看到了一个有意思的小方法

function contains(str, substr){
      return !!~('' + str).indexOf(substr);
}

~”运算符(位非)用于对一个二进制操作数逐位进行取反操作。

位非运算实际上就是对数字进行取负运算,再减 1。

相关文章

网友评论

    本文标题:从moderlizr源码中学到的一些封装思想

    本文链接:https://www.haomeiwen.com/subject/psbhlltx.html