关于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);
}
~”运算符(位非)用于对一个二进制操作数逐位进行取反操作。
网友评论