我的困境涉及JavaScript的Prototypal Inheritance和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
方法结合使用,但是在枚举过程中冒险获得链上太远的成员?
或者您是否使用其他形式的继承将成员直接添加到对象而不是原型?
没有找到相关结果
已邀请:
2 个回复
峨躬坎抬焚
弦砂牧扁
跳过直接成员(如你所说)。这当然也会遍历添加到该对象原型中的任何其他成员(
等......)。没有办法避免这种情况。 这就像是在询问如何避免枚举
对象的某些成员(伪代码)......你不是......你只是根据它们的价值跳过某些成员。 直接向对象添加成员实际上并不是一种继承形式,除非您使用
技术创建对象...因为它使用Prototype添加成员。