题目:检测“某个属性 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循环:
- 如果传递的进来的attr是当前找到的proto原型对象中的一个私有属性,则说明attr是实例的一个公有属性
- 只要还可以找到原型对象,则一直向上找
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;
};