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