.prototype.hasOwnProperty()

オブジェクトが指定されたプロパティを、直接のプロパティとして持つか否かの真偽値を返します。

文法

obj.hasOwnProperty(prop)
引数 説明
prop 確認するプロパティ名を指定します。

Objectからの子孫である各オブジェクトは、hasOwnPropertyメソッドを継承します。 このメソッドは、そのオブジェクトの直接のプロパティとして、 指定されたプロパティをオブジェクトが持つか否かを検証するのに使用されます。 in演算子とは異なり、オブジェクトのプロトタイプチェーンを辿っての確認は行われません。

例: hasOwnPropertyによるプロパティの存在確認

下記の例では、propという名前のプロパティをオブジェクトが含むか否かを確認しています。

o = new Object();
o.prop = 'exists';

function changeO() {
  o.newprop = o.prop;
  delete o.prop;
}

o.hasOwnProperty('prop');   // returns true
changeO();
o.hasOwnProperty('prop');   // returns false

例: 直接的なプロパティと、継承プロパティの比較

下記の例は直接的なプロパティ(下記の例ではo.propと、 プロトタイプチェーンを通して継承されたプロパティを識別しています。

o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop');             // returns true
o.hasOwnProperty('toString');         // returns false
o.hasOwnProperty('hasOwnProperty');   // returns false

例: オブジェクトが持つプロパティの繰り返し処理

下記は、オブジェクトのプロパティの繰り返し処理で、継承プロパティは実行(評価)させたくないようなケースで、参考になる例です。 for...inループは、列挙可能(enumerable)な項目のみを繰り返し処理する事に注意してください。 このループ内のhasOwnProperty自身も自然と列挙可能な項目のみに制限されることになるため、 列挙不可能(non-enumerable)なプロパティを扱うような処理をするべきではありません。(翻訳に自信なし) (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'
};

foo.hasOwnProperty('bar'); // 必ずfalseが返ります。

// 別のオブジェクトのhasOwnPropertyから、
// callメソッドを引数のthisにfooを設定して呼び出します。
({}).hasOwnProperty.call(foo, 'bar'); // true

// また、Objectのプロパティからでも、
// この目的のためにcallを使用することが可能です。
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

2つ目のケースであれば、新しく作成されるオブジェクトが無いことに注目してください。

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。