//クラスの宣言、コンストラクタ、インスタンス変数
function Class(){
this.instanceVariable = initialValue;
}
//メソッド
Class.prototype.method = function(){
...
}
//サブクラスの宣言、コンストラクタ、継承
function SubClass(){
...
}
SubClass.prototype = new Class;
//インスタンスの生成
var object1 = new Class;
var object2 = new SubClass;
通例 ECMAScript では上記のように OOP するのだが、別の流儀を考えてみた。
具体的にいうと、上記のコードが下記のように置き換わる。
/*
新たなオブジェクトを生成するメソッド。
できたオブジェクトのプロトタイプは
メソッドを呼び出したオブジェクト。
*/
Object.prototype.clone = function(){
var tmpFunction = new Function;
tmpFunction.prototype = this;
return new tmpFunction;
}
var Class = new Object;
Class.instanceVariable = initialValue;
Class.method = function(){
...
}
var SubClass = Class.clone();
SubClass.... = ...
var object1 = Class.clone();
var object2 = SubClass.clone();
オブジェクトを clone すると、新しいオブジェクトができて、後者は前者のプロトタイプになる。これによりプロトタイプチェーンが直感的に把握しやすくなり、積極的に利用できるようになる。最初の書き方では、コードから直接親子関係を読み取れるわけではない。
object2.[[Prototype]] == SubClass.prototype
object2.[[Prototype]].[[Prototype]] == SubClass.prototype.[[Prototype]] == Class.prototype
後の書き方では、clone した/された関係がそのままプロトタイプチェーン上の親子関係になる。
object2.[[Prototype]] == SubClass
object2.[[Prototype]].[[Prototype]] == SubClass.[[Prototype]] == Class
Io のオブジェクトの仕組みがこれに似ているらしい(筆者は Io に触れたことは無いのでとんちんかんなことをいっているかもしれない)。
この流儀のメリットは、シンプルであることだ。ただそれに意味あるのかといわれると、まだ積極的に活用していないので何ともいえない。