3

JS 初心者なので、これがばかげた質問でないことを願っています。

メソッドを使用してカスタム オブジェクトを定義する場合、次の 2 つのアプローチの違いと長所/短所は何ですか?

1: を使用してクラス定義内でメソッドを定義しthisます。

function MyObj(){    
    this.doStuff = function(){    
        //method body    
    }    
}

2: を使用してメソッドを個別に定義しprototypeます。

function MyObj(){    
}    

MyObj.prototype.doStuff = function()    
{    
    //method body    
}

私は今それをいじっていますが、どちらも同じように機能しているように見えるので、戻ってきて後でお尻を噛むトラックに向かう前に違いを見つけようと思いました:)

乾杯

4

2 に答える 2

3

を使用するthisと、「クラス」のすべてのインスタンスに独自のメソッドのコピーが含まれます。

を使用するとprototype、すべてのインスタンスがメソッドの 1 つのコピーを共有します。prototypeしたがって、各インスタンスに必要なメモリが少なくなるため、 でメソッドを宣言する方が効率的です。

たとえば、次の 2 つのインスタンスを作成しますMyObj

var o1 = new MyObj(),
    o2 = new MyObj();

メソッドがコンストラクターで宣言されている場合doStuff、これらの各インスタンスは、そのメソッドのコピーをメモリ内に持つようになります。で宣言されている場合はprototype、その 1 つのコピーを共有します。呼び出そうとすると:

o1.doStuff();

インスタンス自体にはプロパティがないdoStuffため、プロトタイプ チェーンを上に移動し、メソッドMyObj.prototypeがある に移動します。doStuff

于 2012-06-07T15:13:10.360 に答える
1

メモリに関する考慮事項の他に、パフォーマンスに関する考慮事項もあります。

thisコンストラクターでのプロパティの定義は非常に遅くなりますが、後でそれらのプロパティに実際にアクセスするという点では、JS エンジンがプロトタイプ チェーンをたどる必要がないため、ローカルで定義されたプロパティのほうがわずかにパフォーマンスが優れています。

つまり、少数のオブジェクトを頻繁に作成しない場合は、コンストラクターでローカルにプロパティを定義する方が適切ですが (#1)、多くのオブジェクトを作成する場合はprototype(#2) を使用します。

于 2012-06-07T15:37:05.933 に答える