2

私は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のテストを行ったところ、実際にパフォーマンスに大きな違いが見られましたが、その理由はわかりません。

4

1 に答える 1

2

パフォーマンスの違いは、1 つではなく 2 つのオブジェクトを作成しているためです。他のオブジェクトのプロトタイプとして使用するためだけに、1 つの追加オブジェクトを作成しています。

このようなオブジェクトをたくさん作成したい場合は、プロトタイプ オブジェクトを 1 つだけ作成し、それを作成するすべてのオブジェクトのプロトタイプとして使用する必要があります。

于 2011-07-02T20:39:12.197 に答える