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
,让您甚至可以区分与继承的同名的属性。