В основном все, кто пишет о перечислении членов в 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
, но рискуете получить членов, которые находятся слишком далеко по цепочке во время перечисления?
Или вы используете другие формы наследования, которые добавляют членов непосредственно к объекту, а не к прототипу?