封装一个检测某属性是否未为该对象公有属性的方法
判断属性为私有或公有,通常会想到用 xxx in obj检测该属性是否属于obj,然后用obj.hasOwnProperty('xxx')来检测xxx是否为obj的私有属性,但是,如果某个属性既是公有的也是私有的,则检测结果是不准确的。
function hasPubProperty(obj, attr){
return (attr in obj) && (!obj.hasOwnProperty(attr));
}
真正的思路应该是检测该属性是否为原型上的属性,因为原型上的属性都是公有的。
function hasPubProperty(obj, attr){
//用Object.getPrototypeOf:获取当前对象的原型
let proto = Object.getPrototypeOf(obj);
while(proto) {
if(proto.hasOwnProperty(attr)){
return true;
}
proto = Object.getPrototypeOf(proto);
}
return false;
}