概要
オブジェクトが指定されたプロパティを持っているかどうかを示す真偽値を返します。
構文
obj.hasOwnProperty(prop)
obj
:Object
オブジェクトprop
: 調べるプロパティ名
説明
Object
の子孫にあたるあらゆるオブジェクトは hasOwnProperty
メソッドを継承しています。このメソッドはあるオブジェクトが指定されたプロパティを、そのオブジェクトの直接のプロパティとして持っているかどうかを特定するのに使うことができます。in
演算子と違って、このメソッドはオブジェクトのプロトタイプチェーンをたどってチェックしません。
例
例: hasOwnProperty
を使ってプロパティの存在を調べる
オブジェクト o
が prop
という名前のプロパティを含んでいるかどうかを特定する例を以下に示します。
var o = new Object(); o.prop = 'exists'; alert( o.hasOwnProperty('prop') ); // true // [プロパティ名を変更する関数] : 指定オブジェクトの特定のプロパティの値を新しいプロパティに移し元のプロパティを削除 function changePropName(obj, propNameStr, newPropNameStr) { o[newPropNameStr] = o[propNameStr]; delete o[propNameStr]; } changePropName(o, "prop", "newProp"); // 関数を実行 alert( o.hasOwnProperty('prop') ); // false (※ prop プロパティは既に newProp プロパティに書き換わっている)
例: 直接のプロパティと継承されたプロパティ
「固有のプロパティ」と、「プロトタイプチェーンを通じて継承されたプロパティ」を識別する方法を以下に示します。
var o = new Object(); o.prop = 'exists'; o.hasOwnProperty('prop'); // true を返す o.hasOwnProperty('toString'); // false を返す o.hasOwnProperty('hasOwnProperty'); // false を返す
例: オブジェクトのプロパティの反復処理
The following example shows how to iterate over the properties of an object without executing on inherit properties. Note that the for..in loop is already only iterating enumerable items, so one should not assume based on the lack of non-enumerable properties shown in the loop that hasOwnProperty itself is confined strictly to enumerable items (as with getOwnPropertyNames).
var buz = { fog: 'stack' }; for (var name in buz) { if (buz.hasOwnProperty(name)) { alert("this is fog (" + name + ") for sure. Value: " + buz[name]); } else { alert(name); // toString or something else } }