2

JavaScript のオブジェクトのすべてのインスタンスでプロトタイプ メソッドが共有されることを理解しています。

コンストラクター関数内でメソッドを宣言し、メソッドの独自のインスタンスを持つオブジェクトのすべてのインスタンスを作成するという、他の状況が必要な場合の実用的な例は思いつきません。これについてのケースを提供できますか?

4

4 に答える 4

2

主な用途は、プライベート フィールドのエミュレートです。例については、ここで私の答えを参照してください。

コンストラクター関数とプロトタイプでの JavaScript オブジェクト メソッドの宣言

于 2012-04-05T16:22:26.223 に答える
1

私は@Raynosにある程度同意します-効率を犠牲にしてプライベートステートを実装することは、不必要で無駄な慣行のように感じます.

一般に、何らかの状態バインディングが必要な場合は、関数を作成する必要があります。したがって、オブジェクトの状態を明示的に参照する関数を渡す必要がある場合は、実用的な価値があります。状態にバインドされた関数を作成するたびにペナルティが発生する場合は、コンストラクターで一度だけバインドし、複数回作成するのではなく、その単一のバインドされた関数を参照するとプラスになります。

状態バインディングは、自分の手で設計を選択することによって必要になる場合があります。たとえば、初期化時にオブジェクトの状態にバインドされたイベント ハンドラーを作成することは理にかなっています。

于 2012-04-05T16:52:11.947 に答える
1

しかし、他の状況が必要になる実用的な例は思いつきません

実例がないからです。

コンストラクター内で関数を宣言することは、不要なパフォーマンスの低下を招くため、既知の悪い習慣です。

また、プロトタイプは拡張性、柔軟性、およびモンキー パッチを促進するため、素晴らしいものであることに注意してください。つまり、すべてを傍受して操作できるため、他人のオブジェクトを修正できるということです。

クロージャーは凍ったオブジェクトのようなもので、柔軟性を奪い、操作、ラップ、または変更するのは悪夢です。

プロトタイプを使用する必要はなく、必要に応じて代わりに関数を使用できることに注意してください。

function cake(fruits, chocolate, size) {
    return {
        slice: function () {
            return cakeSliceList(this)
        },
        toString: function () {
            return "A lovely cake containing " + fruits.toString()
                + ", " + chocolate.toString()
        },
        weight: function () {
            return size * CAKE_SIZE + fruits.weight() + chocolate.weight()
        }
    }
}

機能的なスタイルは有効であり、機能的なスタイルとプロトタイプを組み合わせることは、ばかばかしく、すぐにできます。

于 2012-04-05T16:22:05.253 に答える
0

オブジェクト内の任意の場所でクロージャーを使用していて、関数内でそれらを参照する必要がある場合。または、代わりに、関数を「プライベート」にしたい場合。

もちろん、これにより、どのような状況でクロージャー変数を使用したいのかという問題が生じます。'private' 引数が再びここに表示される場合があります。さらに、クロージャーの一般的な使用法について説明します

于 2012-04-05T16:27:41.563 に答える