JavaScript 入門 | オブジェクト (object) | オブジェクトの扱い

this キーワード

JavaScript で this キーワードは、そのキーワードが使用された JavaScript コード領域を含むオブジェクトを指す。

たとえば、メソッド内部で使用された this キーワードは、そのメソッドを含むオブジェクトを指す。
また、オブジェクト内部で使用された this キーワードは、オブジェクト自身を指す。
この this は変数ではなくキーワードなので、ユーザーが任意に指す値を変更することはできない。

オブジェクトコンストラクター関数内部で使用された this キーワードは値を持たず、単に新しいオブジェクトに置き換えられる。

オブジェクトプロパティの削除

JavaScript でオブジェクトのプロパティを参照する方法は次のとおりである。

構文

オブジェクト名.プロパティ名
または
オブジェクト名["プロパティ名"]

JavaScript では delete キーワードを使用してオブジェクトのプロパティを削除できる。

構文

delete オブジェクト名.プロパティ名;

delete キーワードを使用してプロパティを削除すると、プロパティの値だけでなくプロパティそのものも削除される。
このキーワードは本来オブジェクトのプロパティだけを削除するために作られたため、関数や変数に使用しても何も動作しない。

function Dog(color, name, age) {
    this.color = color;
    this.name = name;
    this.age = age;
}
var myDog = new Dog("白色", "マル", 1);
delete myDog.age; // age プロパティを削除する。
// age プロパティが削除されたため undefined を出力する。
document.write("我が家の犬の年齢は " + myDog.age + " である。");

自分で作成したプロトタイプには、上のように新しいプロパティやメソッドを自由に追加または削除できる。
もちろん JavaScript 標準オブジェクトのプロトタイプも任意に修正できるが、重大なエラーが発生する可能性がある。
したがって JavaScript 標準オブジェクトのプロトタイプは修正してはならない。

オブジェクトプロパティの巡回

JavaScript では for / in 文を使用して、オブジェクトのすべてのプロパティを巡回できる。
for / in 文は、オブジェクトのすべての列挙可能なプロパティ (enumerable properties) を簡単に巡回できるようにする。

オブジェクトのプロパティを巡回する方法としては、for / in 文のほかに次のようなメソッドも使用できる。

  1. Object.keys()
  2. Object.getOwnPropertyNames()

Object.keys() メソッドは、そのオブジェクトが持つ固有プロパティのうち、列挙可能なプロパティ名を配列に入れて返す。
Object.getOwnPropertyNames() メソッドは、そのオブジェクトが持つすべての固有プロパティ名を配列に入れて返す。

function Dog(color, name, age) {
    this.color = color;
    this.name = name;
    this.age = age;
}
var myDog = new Dog("白色", "マル", 1);

// color プロパティの enumerable 属性を false に設定する。
Object.defineProperty(myDog, 'color', {enumerable : false} );
// オブジェクトが持つ固有プロパティのうち、列挙可能なプロパティ名を配列に入れて返す。
document.write(Object.keys(myDog) + "<br>");       // name, age
// オブジェクトが持つすべての固有プロパティ名を配列に入れて返す。
document.write(Object.getOwnPropertyNames(myDog)); // color, name, age

Object.defineProperty() メソッドは ECMAScript 5 から追加された、オブジェクトにプロパティを追加するメソッドである。
このとき、追加するプロパティの属性も設定できる。

オブジェクト間の比較

JavaScript では、別々の 2 つのオブジェクトは、すべてのプロパティ値が同じでも、決して同じとはいえない。

function Dog(color, name, age) {
    this.color = color;
    this.name = name;
    this.age = age;
}
var myDog = new Dog("白色", "マル", 1);
var hisDog = new Dog("白色", "マル", 1);      // すべてのプロパティ値が同じオブジェクトを作成する。
document.write((myDog == hisDog) + "<br>");   // false
document.write((myDog === hisDog) + "<br>");  // false

var herDog = hisDog;                          // hisDog オブジェクトを変数 herDog に代入する。
document.write((hisDog == herDog) + "<br>");  // true
document.write((hisDog === herDog) + "<br>"); // true

上の例で myDog と hisDog オブジェクトは、持っているプロパティ値がすべて同じである。
しかし、この 2 つのオブジェクトは別々のオブジェクトなので、等価 (==) 演算子と厳密等価 (===) 演算子で比較してもどちらも false を返す。

上の例では、変数 herDog に hisDog オブジェクトを代入している。
このようにオブジェクトを代入した変数をオブジェクト参照 (object reference) といい、これ以降、変数 herDog は hisDog オブジェクトを指す。
つまり、オブジェクト参照はオブジェクト自体を保存するのではなく、オブジェクトが位置するアドレスを保存する。
したがって、変数 herDog と hisDog を等価演算子と厳密等価演算子で比較すると、どちらも true を返す。