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

Javascript 如何从一个模块实例化,就好像它是一个具有模块模式的类一样?,javascript,oop,design-patterns,Javascript,Oop,Design Patterns,据我所知,Javascript模块模式模拟基于类的语言中的类,但我还没有找到使用此模式实例化对象的示例。在Java中,类的实例化方式如下: var myClassInstance = new MyClass(); var MyClass = (function(){ function MyClass() { } var privateMethod = function() {}; MyClass.staticMethod = function() {};

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

var myClassInstance = new MyClass();
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 privateMember = 'foo';

    function publicMember() {
    }        

    return {
        publicMember: publicMember
    }
}());
  • 在本例中,如何创建
    MyModule
    的新实例
  • 模块是否要实例化
  • 使用模块模式实例化对象的正确方法是什么
  • 在本例中,如何创建
    MyModule
    的新实例

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

    模块是否要实例化

    大多数并不意味着这样,但是否应该首先实例化模块以使用它取决于您

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

    类可以在javascript中“模拟”,如下所示:

    var myClassInstance = new MyClass();
    
    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"
    
    在本例中,如何创建
    MyModule
    的新实例

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

    模块是否要实例化

    大多数并不意味着这样,但是否应该首先实例化模块以使用它取决于您

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

    类可以在javascript中“模拟”,如下所示:

    var myClassInstance = new MyClass();
    
    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"
    

    最后一个例子似乎是反模式。“实例化”一个模块意味着你可以有多个它的实例——但是你的变量是静态的,你必须调用
    newmymodule
    一次。最好让它成为一个单例对象,并给它一个
    .init(…)
    方法。我必须承认,当a)没有实例状态,b)没有要共享的继承属性,但+1时,我更喜欢工厂而不是构造函数nonetheless@Bergi我认为单身会使代码稍微长一点。实际上,它现在看起来非常简单,尽管它不是,例如,如果它在哪个函数中,人们可能会对
    这个
    的值是如何变化的感到困惑。最后一个例子似乎是一个反模式。“实例化”一个模块意味着你可以有多个它的实例——但是你的变量是静态的,你必须调用
    newmymodule
    一次。最好让它成为一个单例对象,并给它一个
    .init(…)
    方法。我必须承认,当a)没有实例状态,b)没有要共享的继承属性,但+1时,我更喜欢工厂而不是构造函数nonetheless@Bergi我认为单身会使代码稍微长一点。实际上,它现在看起来非常简单,尽管它不是,例如,如果它在哪个函数中,人们可能会对
    这个
    的值是如何变化的感到困惑。您可能想看一看,或者您可能想看一看,或者