Noncommutative Field

記事検索

<<再開に関する備忘録 | Io っぽい ECMAScript の OOP | ECMAScript で Singleton パターンを使う>>

2005年08月10日

Io っぽい ECMAScript の OOP

//クラスの宣言、コンストラクタ、インスタンス変数
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 に触れたことは無いのでとんちんかんなことをいっているかもしれない)。

この流儀のメリットは、シンプルであることだ。ただそれに意味あるのかといわれると、まだ積極的に活用していないので何ともいえない。

posted by malt3rd at 20:36 | TrackBack(0) | ECMAScript

この記事へのトラックバック

プロフィール

名前
malt3rd
URL
http://www.geocities.jp/commutativefield/
メールアドレス
malt3rd {dot} NoncommutativeField {at} submit-asap {dot} org
Powered by Seesaa

RDF Site Summary

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。