引数名と同じスロットを用意するコンストラクタ

関数の引数名と同じスロットを挿入するinitメソッドを作ってみた。

Function.prototype.init = function(obj,arg){
  var slot = this.toString().match(/\(([^)]*)/)[1].split(/, /);
  for(var i=0;i<arg.length;i++) obj[slot[i]] = arg[i];
}

これは、こんな処理を、

function Foo(aaa,bbb,ccc){
  this.aaa = aaa;
  this.bbb = bbb;
  this.ccc = ccc;
}
function Bar(ddd,eee){
  this.ddd = ddd;
  this.eee = eee;
}
foo = new Foo(1,2,3);
bar = new Bar(4,5);

こう書いて済まそうとするもの。

function Foo(aaa,bbb,ccc){
  Foo.init(this,arguments);
}
function Bar(ddd,eee){
  Bar.init(this,arguments);
}
foo = new Foo(1,2,3);
bar = new Bar(4,5);

おぼえがき
関数Foo内でのthisは、newしようとしているオブジェクト
initメソッド内でのthisは、関数オブジェクトFoo自体
argumentsオブジェクトのconstructorは直接function Object(){}になっており、Arguments.prototype等は存在しない。