检测“某个属性 attr”是否为这个“对象 obj”的“公有属性”

166 阅读1分钟

题目:检测“某个属性 attr”是否为这个“对象 obj”的“公有属性”

方案一

思路:是它的属性,并且不是私有的属性,就是公有的属性

const hasPubProperty = function hasPubProperty(obj, attr) {
    // attr in obj: attr是obj的一个属性
    // !obj.hasOwnProperty(attr): attr并不是obj的私有属性
    return (attr in obj) && !obj.hasOwnProperty(attr);
};
console.log(hasPubProperty(f1, 'attr'));

方案一的瑕疵: 如果有一个属性同时是该对象的公有属性和私有属性,则输出会为false。

方案二

思路:是他的公有属性,可以一直找到Object.prototype

  • while循环:
  1. 如果传递的进来的attr是当前找到的proto原型对象中的一个私有属性,则说明attr是实例的一个公有属性
  2. 只要还可以找到原型对象,则一直向上找
Object.prototype.hasPubProperty = function hasPubProperty(attr) {
    let proto = Object.getPrototypeOf(this);
    while (proto) {
        if (proto.hasOwnProperty(attr)) return true;
        proto = Object.getPrototypeOf(proto);
    }
    return false;
};