基本上所有关于JavaScript中成员枚举的人都主张使用hasOwnProperty
方法来避免使用原型链。我关于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);
}
在上面的例子中,只有age
会显示出来,因为age
是mary
唯一的直接成员......其他两名成员,name
和surname
,是原型链。
但显然,我希望所有3个成员迭代在for..in
构造;但如果您删除hasOwnProperty
,则可以从Object.Prototype
获得成员,如果有人向其添加功能的话。
所以这是我的困境。
您是否将原型继承与hasOwnProperty
方法结合使用,但会导致在枚举过程中链接太远的成员面临风险?
或者您是否使用其他形式的继承,将成员直接添加到对象而不是原型?
我没有说通过增加直接成员来增加对象就是继承。但是,使用'beget'函数,您正在使用原型继承,因为您'继承'的类的成员被添加到原型。 – 2010-09-29 09:26:06
就这样说,你的回答并没有让我更接近理解应该做什么。 – 2010-09-29 09:26:33
@Andreas:你想要做什么并不是很清楚。如果你试图遍历一个对象,我回答了你的问题。如果你试图使用直接成员和begetObject()来进行继承,那么你的问题是什么? – 2010-09-29 09:33:03