インスタンスから別のインスタンスを生成する方法 : JavaScript

Pocket

『JavaScript:The Cood Parts』(Douglas Crockford 2008 pp26-27)で紹介しているインスタンスからインスタンスを生成する方法のメモ。

Javaはインスタンスの雛型としてクラスを定義する。定義したクラスから個別のインスタンスを生成するためにnew演算子を用いる。
JavaScriptもfunctionで定義するオブジェクト(以下関数オブジェクトと書く)からインスタンスを生成するためにnew演算子が用意されている[1]
またJavaScriptはオブジェクトの定義とインスタンス生成を同時に行うオブジェクトリテラル{}を用意している[2]

前述のように関数オブジェクトからnew演算子を使い新たなインスタンスを生成することができる。
しかしJavaScriptにはオブジェクトリテラル{}を使い生成したインスタンスから新たなインスタンスを生成する簡単な方法がない[3]
そこでインスタンスからインスタンスを生成する関数を以下のようにObjectオブジェクトに定義する。


		if (typeof Object.create !== 'function') {
			Object.create = function(o) {
				var F = function () { };
				F.prototype = o;  // --- 1
				return new F();    // --- 2
			};
		}
	

Douglas Crockford著, 水野 貴明訳 2008 『JavaScript:The Cood Parts』 オライリージャパン

新しく定義したObjectオブジェクトのcreateメソッドは下記のように使う。


var o = {
    	value : 'hoge',
    	setValue : function (value) {
        	this.value = value;
    	},
    	getValue : function(value) {
        	return this.value;
    	}
};
var another_o1 = Object.create(o);
another_o1.setValue('foo');
another_o1.getValue(); // 実行結果 foo

var another_o2 = Object.create(o);
another_o2.setValue('bar');
another_o2.getValue(); // 実行結果 bar
  1. 関数オブジェクトFのprototypeプロパティに引数で渡したインスタンスを設定する。
  2. F(関数オブジェクト)からnew演算子で生成するインスタンスの暗黙リンク(__proto__プロパティ)[4]にFのprototypeプロパティ(つまり引数で渡したインスタンス)を設定する。

新たなインスタンスの暗黙リンクは元のインスタンスになる。

1. JavaScriptにはクラスはない。しかし、functionで定義したオブジェクトからnew演算子を使いインスタンスを作成することができる。
function MyObject() { this.name = 'example'; } var o = new MyObject();
2. こちらを使う場合も多い。var o = { name: 'example'}。これは実質的には次のコードと同じ処理を行ってい。var o = new Object(); o.name = 'example';
3. var a = { x: ‘example’ }; var b = a; オブジェクトは参照渡しのため左記のコードではbを変更するとaも変更されることに注意する。
4. プロトタイプ・prototype・__proto__ : JavaScriptに詳しく記載している。

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。