私はJavascriptのプロトタイプとクロージャのパターンを少しいじっています。ご存知かもしれませんが、クロージャパターンを使用すると、オブジェクトのすべてのインスタンスに対して同じ関数が再定義されるため、パフォーマンスが低下します。ただし、クロージャパターンではプライベート変数が許可されるため、カプセル化が容易になります。
プロトタイプパターンの典型的な例を次に示します。
function Foo(val) {
this.val = val;
}
Foo.prototype.getVal = function() {
return this.val;
}
var f = new Foo(42);
どうしてこんなことができないのかと思っていました。
function Parent() {
}
Parent.prototype.getVal = function() {
return this.val;
}
function foo(val) {
function Obj {
this.val = val;
}
Obj.prototype = new Parent();
return new Obj();
}
var f = foo(42); // Note the missing 'new'
これにより、foo()関数でプライベート変数が可能になり、foo()関数でプロトタイプを動的に設定することもできます。
jsperf.comのテストを行ったところ、実際にパフォーマンスに大きな違いが見られましたが、その理由はわかりません。