0

古い質問で、何度も尋ねられて答えられましたが、少しひねりがあります。最初のプロトタイプ バージョン:

someA = function() {
    this.val = 'a';
}
someA.prototype.getVal = function() {
    return this.val;
}

今他のバージョン:

someA = function() {
    this.val = 'a';
    this.getVal = function() {
        return this.val;
    }
}

さて、 getVal() 関数がHUGEで、someA の何千ものオブジェクトを作成するとしますが、何らかの理由で this.getVal バージョンを使用したいとしますか? 次のように書いたらどうでしょう。

someA =function() {
    this.val = 'a';
    this.getVal = this._getVal;
}
someA.prototype._getVal = function() {
    return this.val;
}

このようにすると、本質的に両方の利点がありますか?

ps まったく別の (ただし、多少関連する) トピックでは、質問または回答の 1 つに質問とコメントを追加するにはどうすればよいですか?

編集済み:return valの出現箇所をすべてreturn this.val-- ばかげた間違いに変更しました ;-)

4

3 に答える 3

0

このIMOを実行しても意味がありません。

一部の人々は、プロトタイプバージョンはメモリを節約し、パフォーマンスをわずかに向上させると主張するかもしれません。jsPerfでテストを設定して、どのような結果が得られるかを確認することはできますが、それは本当かもしれません。おそらく、大きな違いを生むには十分ではありません。

もちろん、この2つには違いがあります。プロトタイプはプロパティまたはメソッドのインスタンスを1つだけ作成し、コンストラクターはオブジェクトのインスタンスをいくつでも作成します。

私は、あなたにとって意味のあるものを使うか、両方を組み合わせるだけだと思います。パフォーマンスが本当に心配な場合は、コンストラクターを使用して、変更される可能性のある、またはインスタンスごとに一意である必要があるプロパティを追加し、プロトタイプを使用して、すべてのインスタンスで機能するパブリックメソッドを作成します。

于 2012-08-06T07:46:53.830 に答える
0

プロトタイプ化された関数のエイリアスを作成しているだけで、メリットはありません。他の場所で定義された関数は、何かに割り当てるときに変数を認識しません。突然valその範囲に入るわけではありません。

ただし、関数は、関数が定義された場所に関係なく、呼び出しごとに異なるオブジェクトコンテキストを持つことができます。これにより、さまざまなオブジェクトで真の関数を再利用でき、すべてをクロージャの巨大なチェーンに保持して、オブジェクトごとに再作成する必要がなくなります。

コードを実行して、機能しないことを確認できます。

someA =function() {
    var val = 'a';
    this.getVal = this._getVal;
}
someA.prototype._getVal = function() {
    return val; //This will throw reference error because the `val` is not
                //known here.
}
于 2012-08-06T07:43:19.347 に答える
0

以下の例が機能する理由は、getVal関数がクロージャー内にあり、スコープ内のすべての変数を外側の関数内に保持しているためです。したがって、running のインスタンスを作成した結果、アクセスできるsomeAメソッドを持つオブジェクトが得られます。getValの値val

var someA = function() {
  var val = 'a';
  this.getVal = function() {
    return val;
  }
};

val をメンバー変数 (つまり: this.val = 'a';) として公開している場合は、getValメソッドが だけでなく、メンバー変数のバージョンも返す必要がありますreturn val;

var someA = function() {}
someA.prototype = {
  val: 'a',
  getVal: function() {
    return this.val;
  }
};

プロトタイプを使用することは、これが機能的に次のものと同じであることを意味します。

var someA = function() {
  this.val = 'a';
  this.getVal = function() {
    return this.val;
  }
}

しかし、getVal 関数のインスタンスが 1 つしかないため、パフォーマンスが大幅に向上します。ただし、次のように書き換えることで、複数の参照を持つ単一の関数インスタンスを利用できます。

var _getVal = function() {
  return this.val;
};
var someA = function() {
  this.val = 'a';
  this.getVal = _getVal;
}
于 2012-08-06T07:51:25.083 に答える