2

我正在使用 Revealing Prototype Pattern 并将 2 个不同的原型放入同一个 JavaScript 文件中。这些链接指向我发现的与此相关的文章。 http://bit.ly/U83hdg,http://bit.ly/VmJ71h。_ _

我的印象是这些会像原子类一样运行,其中与一个相关的函数将不知道另一个函数。

例如,这两个原型都有一个“init”和一个“set”函数。我在浏览器中看到的行为是“init”的最后一个版本被执行,即使代码引用了第一个原型名称。

这是我的两个原型中的通用精简代码。

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();

当上述运行时,正在执行 operationB 原型中的 init 和 set 函数,而不是执行 operationA 原型中的 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定义时省略了关键字initset因此它们都被分配给全局对象。

于 2013-01-14T23:59:27.503 回答
0

Just define the prototypes as Objects.

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 回答