美文网首页@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