JavaScriptのオブジェクトシステム

(2001.10.11) 新規作成。

# 概要

ECMAScript / JavaScriptは,プロトタイプベースな (prototype-based) オブジェクト指向言語。Java、Rubyなどメジャーなプログラミング言語は、プロトタイプベースではなく、クラスベース (class-based)。

プロトタイプベースのプログラミング言語には、

クラスベースのオブジェクト指向言語では、まずオブジェクト(インスタンス)の雛型となるクラスを定義する。クラスにプロパティ(メンバ変数)、メソッドなどを定義する。オブジェクトはクラスから生成する。クラスが同じであればそれぞれのオブジェクトは同じメソッドを持つ。

JavaScriptでは,クラスというものがなく、それぞれのオブジェクトにメソッド、プロパティを定義する。また、JavaScriptのオブジェクトはただのハッシュで、(プロパティ名: プロパティ値) の集まり。プロパティ値が関数であればそれがメソッドになる。

# オブジェクトの生成

JavaScriptでは、オブジェクトはnew演算子で生成する。

まず、関数をコンストラクタと見立てる方法。

  new 関数オブジェクト ( 引数 )

次の例の Hoge() はただの関数。new演算子は、

  1. 空のオブジェクトを生成し、
  2. コンストラクタ関数を呼び出す; この際にthisは (1) で生成したオブジェクトを指す。
  3. コンストラクタから戻ると、コンストラクタの戻り値がオブジェクトならそのオブジェクトを、戻り値がないかプリミティブ値であれば (1) のオブジェクトを返す。
という動作をする。コンストラクタが何を返すかで生成されるオブジェクトが変わるのが微妙。nullはプリミティブ値なので、コンストラクタがnullを返したときは新たに生成されたオブジェクトのほうがnew演算子の値になる。
JavaScript
  1. function Hoge() {
  2. this.foo = 10;
  3. }
  4. var bar = new Hoge();
  5. document.write(bar.foo); // 10
JavaScript
  1. function C() { this.p = 100; return new String(""); }
  2. var o = new C();
  3. document.write(o.p); // undefined

参考; JavaScript の new 演算子の意味: Days on the Moon

オブジェクトは、constructorプロパティを持ち、このプロパティはオブジェクトを生成した関数を指す。

JavaScript
  1. var F = function(param) { this.m = param; }
  2. var o = new F("hoge");
  3. document.write(o.m); // hoge
  4. document.write(o.constructor); // function (param) { this.m = param; }

# メソッド定義

JavaScriptのメソッドはただの関数で、オブジェクトのプロパティ値として参照されるもの。thisがレシーバになる。

JavaScript
  1. function F(v) {
  2. this.val = v;
  3. this.twoTimes = function() { this.val *= 2; };
  4. }
  5. var o = new F(10);
  6. o.twoTimes();
  7. document.write(o.val); // 20

# prototype

TODO: