如何从模块实例化,就好像它是一个具有模块模式的类?

时间:2016-09-06 22:59:21

标签: javascript oop design-patterns

我的理解是Javascript模块模式模拟基于类的语言中的类,但我还没有找到使用此模式实例化对象的示例。在Java中,类实例化如下:

var myClassInstance = new MyClass();

我见过的所有模块模式教程都解释了使用这种基本语法创建模块:

var MyModule = (function(){
    var privateMember = 'foo';

    function publicMember() {
    }        

    return {
        publicMember: publicMember
    }
}());
  1. 如何在此示例中创建MyModule的新实例?
  2. 模块是否需要实例化?
  3. 使用模块模式实例化对象的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

  

如何在此示例中创建MyModule的新实例?

在您的示例中,您无法创建模块的实例,因为它是一个普通对象。

  

模块是否要实例化?

大多数情况并非如此,但如果您的模块应首先被实例化以便使用它,那么它取决于您。

  

使用模块模式实例化对象的正确方法是什么?

可以模拟课程'在这样的JavaScript中:

var MyClass = (function(){
    function MyClass() {
    }

    var privateMethod = function() {};
    MyClass.staticMethod = function() {};
    MyClass.prototype.instanceMethod = function() {};

    return MyClass;
}());

var classInstance = new MyClass();

像这样的模块或命名空间,就像你的例子一样:

var MyModule = (function(){
    var MyClass = (function(){
        function MyClass() {
        }

        var privateMethod = function() {};
        MyClass.staticMethod = function() {};
        MyClass.prototype.instanceMethod = function() {};

        return MyClass;
    }());            

    return {
        MyClass: MyClass
    };
}());

var classInstance = new MyModule.MyClass();

这些是非常简单的例子,但这种模式可能非常复杂。像这个模块的另一个例子,你必须实例化才能使用它的类:

var MyModule = (function() {

  /** Module constructor */
  function MyModule(arg0, arg1) {

    this.MyClass = (function() {

      /** Class constructor */
      function MyClass() {
        this.publicArg0 = arg0;
        this.publicArg1 = arg1;
      }

      var privateMethod = function() {};
      MyClass.staticMethod = function() {};
      MyClass.prototype.instanceMethod = function() {};

      return MyClass;
    }());

  };

  return MyModule;
}());

var moduleInstance = new MyModule('#some', 1324);
var classInstance = new moduleInstance.MyClass();

console.log(classInstance.publicArg0) // "#some"
console.log(classInstance.publicArg1) // "1324"