14

このコードですか、

function Person() {
    function  myMethod() {
        alert ('hello');
    }
    this.method = myMethod;
}

に相当:

function Person() {    }
Person.prototype.method2  = function() {
    alert ('hello');
};

はいの場合、どのメソッド定義を使用する必要がありますか?またその理由は?

4

5 に答える 5

14

単純な例では機能的に同等ですが、舞台裏での動作は大きく異なります。関数のprototypeプロパティは、実際には「プロトタイプ テンプレート」です。「オブジェクトが作成され、私がオブジェクトのコンストラクターとして使用されるときはいつでも、このオブジェクトをプロトタイプとして与えてください」と書かれています。

したがって、2 番目の例で作成されたすべての は、メソッド Personの同じコピーを共有します。method2

function最初の例では、インタープリターがキーワードに遭遇するたびに、新しい関数オブジェクトを作成します。したがって、最初の例では、 の各インスタンスはメソッドPersonの独自のコピーを持ちますmyMethod。ほとんどの場合、これは問題ではありません。しかし、この最初のアプローチはより多くのメモリを使用し、場合によってはそれが問題になります。

より興味深いケースでは、それらは機能的に同等ではありません。最初の例でmyMethodは で定義されたローカル変数にアクセスできますPersonが、2 番目の例ではアクセスできません。これが 1 つの違いです。

于 2012-05-08T14:10:30.860 に答える
2

最初のシナリオでは、新しい人物 を作成するvar person1 = new Person();と、独自の のコピーが作成されますmyMethod。100 個の Person オブジェクトを作成すると、それぞれにこのメソッドの独自のコピーが作成されます。

プロトタイプを使用すると、すべての新しい Person オブジェクトがメソッド定義を共有します。メソッドのコピーが 1 つしかないため、メモリ効率が大幅に向上します。

複数の Person オブジェクトを持つことを計画している場合は、2 番目の方法が適しています。ただし、Person オブジェクトが少数しかない場合は、それほど重要ではありません。

于 2012-05-08T14:11:57.793 に答える
1

完全に同等ではありません。

どちらの場合も、Person()グローバル名前空間で関数 (コンストラクター) を定義します。

myMethod()最初のケースでは、関数内のクロージャで新しい関数を定義しPerson()ます。通常、myMethod()関数/コンストラクターがPerson()終了すると、関数は使用できなくなります。ただし、この場合は に割り当てますthis.method。したがって、コンストラクタを実行すると

var myPerson = new Person();

新しいオブジェクトが作成され、新しいオブジェクトPerson()に設定して関数が呼び出されthisます。したがって、新しいオブジェクトは、関数がバインドされたmethodフィールドを受け取ります。myMethod

2 番目のケースでmethod2は、 内で定義されますPerson.prototype。この場合、電話をかけると

var myPerson = new Person();

新しいオブジェクト内で直接定義されたフィールドはありません ( thisfunction で何もしないためPerson)。ただし、すべてのオブジェクトには、そのプロトタイプへの参照が含まれています。オブジェクトが を呼び出して作成された場合Person()、この参照は に設定されPerson.prototypeます。したがって、オブジェクトには最終的に が含まれますがmethod2、それ自体には直接ではなく、プロトタイプに含まれます。だからあなたが電話するとき

myPerson.method2();

インタプリタはオブジェクトmethod2myPersonを探しても何も見つからないので、 のプロトタイプを調べてmyPersonPerson.prototype見つけmethod2、それを呼び出します。

簡単に言えば、最初にコンストラクターがメソッドを作成するため、コンストラクターを呼び出すたびに、新しいメソッドが作成され、新しいオブジェクトに挿入されます。2 番目のケースでは、メソッドはプロトタイプに格納されるため、作成するすべてのオブジェクトはメソッドの同じインスタンスへの参照を持ちます。

于 2012-05-08T14:16:02.410 に答える
0

これらは同様の機能を備えていますが、2番目のアプローチ(プロトタイプ)を使用する必要があります。これは、すべてのオブジェクトを使用してオブジェクトを作成する場合、new Person()すべてのオブジェクトが同じものを共有しますがmethod2、最初のアプローチを使用すると、新しいオブジェクトごとに独自のオブジェクトがあり、myMethod()萌えメモリを消費するためです。

数日前、私は同様の質問をし、 この答えを得ました。

于 2012-05-08T14:12:55.943 に答える
0

いいえ、それらは同等ではありません。しかし、それらは似ています。myMethod最初のメソッドは、作成されたそれぞれに対して新しい関数をnew Person()作成します。

method22 番目の方法には、すべての によって「共有」される1 つの関数がありますPerson's

于 2012-05-08T14:09:54.393 に答える