JavaScript

Object.prototype.hasOwnProperty()メソッド

 編集:2022.08.08 by T.A.

オブジェクト自身が(継承されていない)指定されたプロパティを持っているかどうかを示す真偽値を返します。

obj.hasOwnProperty(prop)
obj テストされるオブジェクト
prop テストするプロパティの名前の String または Symbol 。
戻り値

Boolean で、オブジェクトが指定されたプロパティを自身のプロパティとして持っているかどうかを示す。

解説

Object のすべての子孫は hasOwnProperty メソッドを継承しています。このメソッドはあるオブジェクトが指定されたプロパティを、そのオブジェクトの直接のプロパティとして持っているかどうかを特定するのに使うことができます。in 演算子とは異なり、このメソッドはオブジェクトのプロトタイプチェーンをたどってチェックしません。Object が Array の場合、hasOwnProperty メソッドはある添字が存在するかどうかを調べることができます。

注意

hasOwnProperty はプロパティの値が null または undefined であっても true を返します。

o = new Object();
o.propOne = null;
D=o.hasOwnProperty('propOne'); //=true
o.propTwo = undefined;
D=o.hasOwnProperty('propTwo'); //=true
hasOwnProperty を使ってプロパティの存在を調べる

オブジェクト o が prop という名前のプロパティを持っているかどうかを特定する例を以下に示します。

Obj=new Object();
D=Obj.hasOwnProperty('prop'); //=false
Obj.prop='exists';
D=Obj.hasOwnProperty('prop'); //=true
直接のプロパティと継承されたプロパティ

以下の例では、直接のプロパティとプロトタイプチェーンを通じて継承されたプロパティを区別します。

Obj=new Object();
Obj.prop='exists';
D=Obj.hasOwnProperty('prop');           //=true
D=Obj.hasOwnProperty('toString');       //=false
D=Obj.hasOwnProperty('hasOwnProperty'); //=false
オブジェクトのプロパティの反復処理

以下の例では、継承されたプロパティを除いてオブジェクトのプロパティを反復処理する方法を示します。なお、for...in ループですでに列挙可能なアイテムのみが反復処理されるので、hasOwnProperty 自体は列挙可能なアイテムに厳密に限定されているため、ループ内に列挙できないプロパティが見られないことに基づいて想定するべきではありません(Object.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 または何か他のもの
  }
}
プロパティ名としての hasOwnProperty の使用

JavaScript は hasOwnProperty というプロパティ名を保護していません。したがって、オブジェクトがこの名前のプロパティを持っている場合が存在すれば、正しい結果を得るためには外部の hasOwnProperty を使用する必要があります。

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};
D=foo.hasOwnProperty('bar'); //=false

// 別な Object の hasOwnProperty 使用して、this を foo に設定して呼び出す。
D=({}).hasOwnProperty.call(foo, 'bar'); //=true

// この目的では、Object プロトタイプの hasOwnProperty プロパティを使用することもできます。
D=Object.prototype.hasOwnProperty.call(foo, 'bar'); //=true

なお、後者の場合は新しくオブジェクトを生成しません。¶


テスト