2

私はRevealingPrototypePatternを使用しており、同じJavaScriptファイルに2つの異なるプロトタイプを入れています。これらのリンクは、これに関連する私が見つけた記事へのリンクです。 http://bit.ly/U83hdg、http://bit.ly/VmJ71h。_ _

これらはアトミッククラスのように動作し、一方に関連付けられた関数が他方の関数を認識しないという印象を受けました。

たとえば、これらのプロトタイプは両方とも「init」関数と「set」関数を持っています。私がブラウザで見ている動作は、コードが最初のプロトタイプ名を参照している場合でも、「init」の最後のバージョンが実行されることです。

これは、私の2つのプロトタイプからの一般的な簡略化されたコードです。

var operationA = function (control, settings) {
   this.control = control;
   this.settings = settings;
};

operationA.prototype = function () {
   init = function () {
      // do something
      return this;
   }
   set = function () {
      // do something
      return this;
   };

   return {
      init: init,
      set: set
   };
}

var operationB = function (control, settings) {
   this.control = control;
   this.settings = settings;
};

operationB.prototype = function () {
   init = function () {
      // do something
      return this;
   }
   set = function () {
      // do something
      return this;
   };

   return {
      init: init,
      set: set
   };
}

これが、最初のオブジェクトをインスタンス化する方法です。

var objectASettings = {
   property1: 48,
   property2: 37
};
var objectA = new operationA('#mySelector', objectASettings);
objectA.init().set();

上記を実行すると、operationAのプロトタイプからinitおよびset関数を実行する代わりに、operationBのプロトタイプからのinitおよびset関数が実行されます。

これらのプロトタイプは、基本的に、含まれている関数に名前空間を付けていると思いました。operationAとoperationBの一意のパブリック関数名(initA、setA、initB、setBなど)を作成する必要がありますか?

これらのパブリック関数を自己完結および/または名前空間化する方法はありますか?それで、initの同じ操作名を公開し、同じファイル内の2つの異なるプロトタイプに設定できますか?

ご協力いただきありがとうございます。

4

3 に答える 3

7

それを機能させるためのいくつかのこと:

  1. プロトタイプ関数の最初のメンバーの前にvarを追加します。
  2. 各メンバーをコンマで区切ります(各メンバーの前にvarを付けることはできますが、クリーンに保つのが好きです...個人的な好みです)。
  3. パターンが正しく機能するには、プロトタイプに割り当てられた関数を自己呼び出しする必要があります。

これがあなたのために働くはずの例です:

<html>
<head>
   <script>
        var operationA = function (control, settings) {
           this.control = control;
           this.settings = settings;
        };

        operationA.prototype = function () {
           var init = function () {
              // do something
              return this;
           },
           set = function () {
              alert('set A');
              return this;
           };

           return {
              init: init,
              set: set
           };
        }();

        var operationB = function (control, settings) {
           this.control = control;
           this.settings = settings;
        };

        operationB.prototype = function () {
           var init = function () {
              // do something
              return this;
           }, 
           set = function () {
              alert('set B');
              return this;
           };

           return {
              init: init,
              set: set
           };
        }();

        window.onload = function() {
            var objectASettings = {
               property1: 48,
               property2: 37
            };
            var objectBSettings = {
               property1: 50,
               property2: 50
            };
            var objectA = new operationA('#mySelector', objectASettings);
            objectA.init().set();

            var objectB = new operationB('#foo', objectBSettings)
            objectB.init().set();
        }
   </script>
</head>

于 2013-01-15T03:07:16.677 に答える
4

var定義するときにキーワードを省略しているinitためset、両方ともグローバルオブジェクトに割り当てられます。

于 2013-01-14T23:59:27.503 に答える
0

プロトタイプをオブジェクトとして定義するだけです。

var operationA = function (control, settings) {
   this.control = control;
   this.settings = settings;
};

operationA.prototype = {
   init: function () {
      // do something
      return this;
   },
   set: function () {
      // do something
      return this;
   }
}

var operationB = function (control, settings) {
   this.control = control;
   this.settings = settings;
};

operationB.prototype = {
   init: function () {
      // do something
      return this;
   },
   set: function () {
      // do something
      return this;
   }
};
于 2013-01-15T00:07:19.187 に答える