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