基本上每个在 JavaScript 中写成员枚举的人都强烈主张使用该hasOwnProperty
方法以避免上升原型链。
我知道这是一种防御性编程形式,以防止迭代添加到的成员,例如添加到Object.prototype
. 但是其他继承的成员呢?比如说,原型链中非常接近的成员......您实际上想要枚举的成员。
假设我有以下内容:
var beget = function (o) { // http://javascript.crockford.com/prototypal.html
function F() {};
F.prototype = o;
return new F();
};
var john = { name: 'john', surname: 'grech' },
mary = beget(john),
p;
mary.age = 42; //augmenting 'mary'
// 'surname' in mary => true
// mary.hasOwnProperty('surname') => false
for (p in mary) {
//skipping over non-direct members, meaning that we also skip members
//inherited from 'john'
if (!mary.hasOwnProperty(p)) {
continue;
}
console.log(p);
}
在上面的示例中, onlyage
将被显示,因为age
是mary
...其他两个成员的唯一直接成员,name
和surname
是原型链的上游。
for..in
但显然,我希望在构造中迭代所有 3 个成员;但是,如果您删除,则如果有人向其添加功能,则hasOwnProperty
可以从中获取成员。Object.Prototype
所以这是我的困境。
您是否将原型继承与hasOwnProperty
方法结合使用,但冒着在枚举过程中让成员离链太远的风险?
或者您是否使用其他形式的继承,将成员直接添加到对象而不是原型?