Metoda hasOwnProperty informuje, czy właściwość znajduje się bezpośrednio na instancji obiektu, czy odziedziczona po prototypowym łańcuchu.
Rozważmy następujący
function ObjWithProto() {
this.foo = 'foo_val';
}
ObjWithProto.prototype = {bar: 'bar_val'};
var dict = new ObjWithProto();
dict.foobar = 'foobar_val';
tj użytkownik posiada Objectdict
o właściwościach foo
i foobar
że również dziedziczy nieruchomość bar
od jego łańcucha prototypów.
Teraz uruchom go poprzez (zmodyfikowanej wersji) swój kod
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);
Zobaczysz
has foo foo_val
has foobar foobar_val
not bar bar_val
Pozwala to odrębne właściwości, że obiekt ma się i tych, których odziedziczyła (co zwykle są to metody, które nie mają związku z pętlą)
Ponadto, jeśli teraz robisz dict.bar = 'new_bar_val';
, ostatni wynik zmieni się na has bar new_bar_val
, umożliwiając rozróżnienie między właściwościami o tej samej nazwie co odziedziczone.
Jest to dobrze wyjaśnione tutaj: http://stackoverflow.com/a/136411/27512 – kevingessner
Wygląda na to, że 'klucz' jest globalny, skąd pochodzi ten kod, czy możesz umieścić w nim link? – elclanrs
@elclanrs Myliłem się. Ten kod pochodzi z Chrome utils.js – scusyxx