javascript 检测某个属性是否为公有属性

201 阅读1分钟

封装一个检测某属性是否未为该对象公有属性的方法

判断属性为私有或公有,通常会想到用 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;
}