Noncommutative Field

記事検索

<<ECMAScript で変数やメソッドを隠蔽する方法 | prototype.js を用いた OOP で、後方参照できるクラスを宣言する | ECMAScript の 型変換についてメモ>>

2005年09月07日

prototype.js を用いた OOP で、後方参照できるクラスを宣言する

実践 prototype.js [2] 中にある、ひげぽんさんの疑問の解決法を思いついた。

//この方法では引数が渡せない
function Hoge(){
    Hoge = Class.create();
    Hoge.prototype = (new HogeBase).extend({
        initialize : function(){...},
        ...
    });
    return new Hoge();
}

困ったのは最後の return new Hoge() である。これでは引数が渡せない。new がなければ Hoge.apply(Hoge , arguments) とか出来るのに。

しょうがないので eval を使って解決した。

//この部分は最初に読み込ませる
Function.prototype.createInstance = function(){
    var strArgs = 'new this(';
    for(var i = 0; i < arguments.length; i++){
        strArgs += 'arguments[' + i + ']';
        if(i != arguments.length - 1){
            strArgs += ',';
        }
    }
    strArgs += ')';
    return eval(strArgs);
}
Function.prototype.newWithArgumentsArray = function(args){
    return this.createInstance.apply(this , args);
}


//Hoge は後方参照できる
function Hoge(){
    Hoge = Class.create();
    Hoge.prototype = (new HogeBase).extend({
        initialize : function(){...},
        ...
    });
    return Hoge.newWithArgumentsArray(arguments);
}

eval を使わずに解決する方法はないものだろうか?

正解がトラックバックされています。


ただし、後方参照できているかのように振舞うのは new HogeHoge() の場合のみだ。メソッドを追加しようとして、Hoge.prototype.additionalMethod = function(){...} などとやっても事前に new HogeHoge() を1回でも行ってない限り、書き換えられる前の Hoge のプロパティに追加されてしまいうまくいかない。後方参照できるということは、定義が静的であるということだから、動的にやるとうまくいかないのは当然だろう。

posted by malt3rd at 13:35 | TrackBack(1) | ECMAScript

この記事へのTrackBack URL

http://blog.seesaa.jp/tb/6656556

JavaScript の new 演算子の意味
Excerpt
JavaScript における new 演算子の動作は大まかにいって以下のとおりである。(new F() とした場合。) 新しいオブジェクトを作る。 1 で作ったオブジェクトの [[Proto..
Weblog
Days on the Moon
Tracked
2005-10-24 16:31

プロフィール

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

RDF Site Summary

×

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