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
、同じ名前のプロパティであっても継承されたものと区別できるようになります。