6

JavaScriptでオブジェクトを作成する際の違いは何ですか

test = function(a, b){
   this.calculate = function(){
      return a + b;
   }
}
obj = new test(1, 2);
console.log(obj.calculate());

test = function(a, b){
   return {
      calculate: function(){
         return a + b;
      }
   }
}
obj = test(1, 2);
console.log(obj.calculate());

私は両方をさまざまな状況で使用しましたが、違いを理解していませんでした。後者のアプローチには、インスタンスごとに関数を作成するオーバーヘッドがあることを知っていますが、多くの状況で使用されていることがわかります。これについて検索しても何も見つかりませんでした

4

2 に答える 2

5

最初のものは、すべてのインスタンスの関数も作成します。この状況での唯一の違いは、新しいインスタンスtest.prototypeが最初のケースでは から継承するのに対し、2 番目のケースでは直接継承することObjectです。

最初のケースでは、関数をプロトタイプに追加することで、インスタンスにコードを共有させる方が簡単です。例えば:

var Test = function(a, b){
   this._a = a;
   this._b = b;
};

Test.prototype.calculate = function(){
   return this._a + this._b;
};

すべてのインスタンスは から継承するためTest.prototypecalculate関数は 1 回しか存在せず、すべてのインスタンスが同じ関数を参照します。

于 2013-01-23T09:18:50.320 に答える
2

Felix がコメントで言ったように、違いは継承チェーンです。1 つ目は から継承しtest.prototype、2 つ目は から継承しObjectます。その結果、関数を一度だけ作成してすべてのインスタンスで共有したい場合は、次のようにする必要があります。

test = function (a, b) {
  this.a = a;
  this.b = b;
}

test.prototype.calculate = function () {
  return this.a + this.b;
}
于 2013-01-23T09:18:57.340 に答える