JavaScript再入門その3

プロトタイプ(prototype)によるJavaScriptのオブジェクト指向より

クラスベースとプロトタイプベース

JavaScriptではクラス-インスタンスという考え方をしません。オブジェクトは別なオブジェクトを元(プロトタイプ)にして独自の特徴を付加することで存在する、という考え方をします。このようなオブジェクト指向言語のことを、プロトタイプベースオブジェクト指向言語(Prototype Based Object Oriented Language)と言います。

コンストラクタという機構

単純なコンストラク
function SimpleConstructor() {}

var obj = new SimpleConstructor();
コンストラクタ内の定義
function PropSetConstructor() {
    this.prop1 = 10;
    this.prop2 = 20;
}

var obj1 = new PropSetConstructor();
alert(obj1.prop1);    // 10 と表示される。
var obj2 = new PropSetConstructor();
alert(obj2.prop1);    // 10 と表示される。
暗黙の参照
var objectA = ...
// objectB は objectA に対し暗黙の参照を持っている
// (objectAはobjectBのプロトタイプである)。
var objectB = ...

objectA.hoge = 10;    // objectA の hoge プロパティをここで設定する。
alert(objectB.hoge);  // 10 と評価される。
prototypeオブジェクト
function PrototypeTestConstructor() {};

// prototype オブジェクトに prop1 というプロパティを設定。
PrototypeTestConstructor.prototype.prop1 = 30;

var obj = new PrototypeTestConstructor();
alert(obj.prop1);    // 30 と表示される。
prototypeをたどらない
function Constructor() {}
Constructor.prototype.prop1 = 30;

var objA = new Constructor();
var objB = new Constructor();           //   [α]

alert(objA.prop1)     // 30 と表示される。
alert(objB.prop1)     // 30 と表示される。

objA.prop1 = 100;                       //   [β]

alert(objA.prop1)     // 100 と表示される。
alert(objB.prop1)     // 30 と表示される。
αの状態


βの状態


プロトタイプチェーン

プロトタイプチェーンの例
var objA = new Object();
objA.prop1 = 10;
function Func1() {};
Func1.prototype = objA;

var objB = new Func1();
function Func2() {}
Func2.prototype = objB;

var objC = new Func2();

alert(objC.prop1);       // 10 と評価される。

hasOwnPropertyメソッド

hasOwnProperty
function Constructor() {}
Constructor.prototype.prop1 = 30;

var objA = new Constructor();

// objA 自体は持っていないので false。
alert(objA.hasOwnProperty("prop1"));

objA.prop1 = 100;

// objA 自体が持っているので true。
alert(objA.hasOwnProperty("prop1"));

まとめ

  • JavaScriptは、既存のオブジェクトを基に新たなオブジェクトを生成する、プロトタイプベースのオブジェクト指向言語である。
  • 関数オブジェクトをnew演算子で使用することによって、新たなオブジェクトを生成するコンストラクタになる。
  • 関数オブジェクトのprototypeプロパティに代入されているオブジェクトは、その関数オブジェクトをコンストラクタとして生成されたオブジェクトから暗黙の参照をされている。
  • この暗黙の参照の連鎖をプロトタイプチェーンと呼ぶ。
  • hasOwnPropertyメソッドによって、オブジェクト自身にプロパティがあるかどうか判断することができる。