第54回
今回は、思いつきで、「無名クラス」的なものが出来るかどうか実験します。
つまり、コンストラクタを無名関数的に定義して、それを括弧で括って引数を渡したものに
newステートメントを使っています(この辺は曖昧)。
「無名コンストラクタ」といった方がいいかもしれません。
詳しくは、コードが全てを物語っています。
function Main1(){
	var a=new (function(name){
		this.Name=name;
		this.Speak=function(){
			alert('私の名前は'+this.Name+'です');
		}
	})('sakata');
	a.Speak();
	alert(a.constructor);
}
これは驚きました。出来るんですね。
念と興味本位のためにconstructorを参照してみましたが、面白いですね。
ちなみに、newが無いとエラーになります。
この結果から、newは、
「new コンストラクタ」によってオブジェクトを返すもの
といった解釈ができそうですね。
おまけ
function Main2(){
	var a=function(x){return x+3}(2);
	var b=new function(x){this.v=x}(2);
	var c=new function(x){return x+3};
	var d=new function(x){return x+3}(2);
	alert('a='+a+'\na.con='+a.constructor);
	alert('b='+b+'\nb.v='+b.v+'\nb.con='+b.constructor);
	alert('c='+c+'\nc.con='+c.constructor);
	alert('d='+d+'\nd.con='+d.constructor);
}
上の4行と結果だけを見てください。
a,bについてはfunctionを括る括弧は不要ということで。
c,dのもつ値については議論の余地がありそうです。
top  戻る