19

私が理解したいことを説明しようとする 2 つの例を見てみましょう。

var Car = function(){
  // Init class
  function Car() { };
  // Private func/vars
  var private = { color:'red' };
  // Public func/vars
  Car.prototype = {
    newColor: function(color) { private.color = color },
    getColor: function() { return private.color }
  };

  return Car.prototype; // return with prototype
};

var myCar = new Car();

と:

var Car = (function(){
  // Init class
  function Car() { };
  // Private func/vars
  var private = { color:'red' };
  // Public func/vars
  Car.prototype = {
    newColor: function(color) { private.color = color },
    getColor: function() { return private.color }
  };

  return Car; // avoid prototype adding parentheses on next line;
})();

var myCar = new Car();

見てみましょう! どちらのクラスも関数式として作成され、どちらも同じように機能します。それらの唯一の違いは次のとおりです。2 番目は Car 関数を返し、prototype プロパティを回避し、代わりに IIFE を使用します。

return Car.prototype;useと avoid IIFE と use return Car;using IIFE (クラス宣言の最後の括弧)の違いは何ですか。

4

1 に答える 1

17

2 番目のコード サンプルは、探しているものを実現する適切な方法です。すぐに実行される関数を作成し、その中で新しい関数を作成し、そのプロトタイプに追加してから返します。

最初の例は少し奇妙で、コンストラクター関数を適切に作成していません。この線

return Car.prototype; // return with prototype

Car 関数は、以前に割り当てたオブジェクト リテラルを常に返すだけですCar.prototype。これは、呼び出された関数の通常の動作をオーバーライドしますnew


注意すべきことは、次の行です。

Car.prototype = {
   newColor: function(color) { private.color = color },
   getColor: function() { return private.color }
};

新しく作成されたオブジェクトのconstructorプロパティが Car 関数を指さなくなります。これが重要な場合、これを修正する簡単な方法が 2 つあります。

Car.prototype = {
   newColor: function(color) { private.color = color },
   getColor: function() { return private.color }
};
Car.prototype.constructor = Car;   // <-------- add this line

または、上記を次のように変更します

Car.prototype.newColor = function(color) { private.color = color };
Car.prototype.getColor = function() { return private.color };
于 2012-11-05T05:19:32.817 に答える