for..in и hasOwnProperty [дубликат]


Возможные Дубликаты:
Как проверить, есть ли у объекта свойство в Javascript?

я нашел следующий фрагмент в JS-файлах Twitter. Мне было интересно, почему они должны вызывать

4 55

4 ответа:

потому что если вы этого не сделаете, он будет перебирать каждое свойство в цепочке прототипов, включая те, о которых вы не знаете (которые, возможно, были добавлены кем-то, кто возился с прототипами собственных объектов).

таким образом, Вы гарантированно только ключи, которые находятся на самом экземпляре этого объекта.

The hasOwnProperty метод позволяет узнать, является ли свойство непосредственно на экземпляре объекта или наследуется от его прототипа цепи.

рассмотрим следующее

function ObjWithProto() {
    this.foo = 'foo_val';
}

ObjWithProto.prototype = {bar: 'bar_val'};

var dict = new ObjWithProto();
dict.foobar = 'foobar_val';

т. е. у вас есть объектdict свойства foo и foobar который также наследует свойство bar от его прототипа цепи.

теперь запустите его через (модифицированную версию) вашего код

function forEach(dict) {
    var key;
    for (key in dict) {
        if ( dict.hasOwnProperty(key) ) console.log('has', key, dict[key]);
        else console.log('not', key, dict[key]);
    }
}
forEach( dict );

вы увидите

has foo foo_val
has foobar foobar_val
not bar bar_val

это позволяет разделить свойства, которые объект имеет сам и те, которые он унаследовал (которые, как правило, методы, которые не имеют отношения к циклу)

кроме того, если вы сейчас делаете dict.bar = 'new_bar_val';, последний результат изменится на has bar new_bar_val, что позволяет различать даже свойства с тем же именем, что и унаследованные.

каждый объект на javascript является словарем, это означает ,что" toString " и каждый другой метод является ключом каждого объекта

var myObj = {};
console.log(myObj["toString"]);

но эта функция наследуется от класса Object, поэтому hasOwnProperty сообщает вам, принадлежит ли этот ключ словарю или он наследуется.

"toString" in myObj; // true
myObj.hasOwnProperty("toString") // false

@blockhead находится прямо здесь. Например, прототип.JS framework используется для расширения собственных массивов с дополнительными вспомогательными методами (я не знаю ситуацию с текущими версиями фреймворка). Таким образом, прямое использование "for (key in dict)" вернет все элементы div плюс ссылки на вспомогательные методы. Что несколько неожиданно :)