基本上所有關於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