JavaScript

レシピ

オブジェクト

オブジェクトが特定のプロパティを持っているか確認する

オブジェクトが特定のプロパティを持っているか確認する方法について解説します。

この記事のポイント

  • オブジェクト単体のプロパティのみチェックしたいときはhasOwnPropertyメソッドを使う
  • 親オブジェクトのプロパティも含めて確認したいときは「プロパティ名 in オブジェクト」を使う

目次

オブジェクトのプロパティの有無を確認する

オブジェクトが特定のプロパティを持っているか確認したいときは以下のいずれかの方法を使います。

  • hasOwnPropertyメソッドで確認(プロトタイプチェーンは確認しない)
  • プロパティ名 in オブジェクトで確認(プロトタイプチェーンを遡って確認する)

2つの方法の違いはプロトタイプチェーンも含めて確認するかどうかです。
1つ目のhasOwnPropertyメソッドはプロトタイプチェーンは確認せずに、そのオブジェクト単体が特定のプロパティを持つか確認することができます。

以下の例では、Personオブジェクトを定義した後に、オブジェクトのインスタンス「John」と「Emilia」を作成して、それぞれが指定したプロパティを持っているかhasOwnPropertyメソッドを使って確認していきます。

コード例

// 雛形になるオブジェクト「Person」を定義
var Person = function( id, name){
  this.id = id;
  this.name = name;
};
Person.prototype.id = 0;
Person.prototype.name = null;
Person.prototype.getId = function(){
  return this.id;
};
Person.prototype.getName = function(){
  return this.name;
};

// Personオブジェクトのインスタンス「John」を作成
var John = new Person( 15001, 'John');
John.job = 'Fisherman';

// Personオブジェクトのインスタンス「Emilia」を作成
var Emilia = new Person( 15002, 'Emilia');
Emilia.job = 'Teacher';
Emilia.subject = 'English';
Emilia.getSubject = function(){
  return this.subject;
};

// 「John」が特定のプロパティを持つか確認
console.log(John.hasOwnProperty('id')); // true
console.log(John.hasOwnProperty('name')); // true
console.log(John.hasOwnProperty('job')); // true
console.log(John.hasOwnProperty('subject')); // false
console.log(John.hasOwnProperty('getSubject')); // false

// 「Emilia」が特定のプロパティを持つか確認
console.log(Emilia.hasOwnProperty('id')); // true
console.log(Emilia.hasOwnProperty('name')); // true
console.log(Emilia.hasOwnProperty('job')); // true
console.log(Emilia.hasOwnProperty('subject')); // true
console.log(Emilia.hasOwnProperty('getSubject')); // true

hasOwnPropertyメソッドはプロパティが存在する場合は「true」、なければ「false」を返します。
プロパティの「存在」を確認するメソッドなので、値がnullundefinedだったり、メソッドが入っていても存在すればtrueが返ってきます。

オブジェクトのプロトタイプチェーンを遡ってプロパティの有無を確認する

hasOwnPropertyメソッドはオブジェクト単体のプロパティのみ確認しますが、もう1つの「プロパティ名 in オブジェクト」を使うとプロトタイプチェーンを遡ってプロパティの存在を確認することができます。

以下の例では、PersonオブジェクトgetIdプロパティgetIdメソッド)の存在について、Personオブジェクトのインスタンス「John」からhasOwnPropertyメソッドと「プロパティ名 in オブジェクト」の2つの方法を使って確認します。

コード例

// 雛形になるオブジェクト「Person」を定義
var Person = function( id, name){
  this.id = id;
  this.name = name;
};
Person.prototype.id = 0;
Person.prototype.name = null;
Person.prototype.getId = function(){
  return this.id;
};
Person.prototype.getName = function(){
  return this.name;
};

// 「John」が特定のプロパティを持つか確認
var John = new Person( 15001, 'John');

// プロパティの存在を確認
console.log(John.hasOwnProperty("getId")); // false
console.log("getId" in John); // true

hasOwnPropertyメソッドではオブジェクト「John」が持つプロパティのみ確認するため「false」が返されますが、「“getId” in John」はプロトタイプチェーンを遡ってPersonオブジェクトのプロパティも含めて確認するため「true」を返します。

以上のように、プロトタイプチェーンを経由して、親にあたるオブジェクトが持つプロパティの存在も確認したいかどうかで2つの方法を使い分けることができます。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。