在javascript中oops:从另一个方法调用一个方法?

时间:2013-12-18 18:21:47

标签: javascript jquery closures prototypal-inheritance iife

我正在尝试在javascript中管理我的代码。我所做的是创建了两个类。

(function(){
 Main1 = function(){
    return this;
  }

Main1.prototype = {
Main1_method1 : function(){

},
Main1_method2 : function(){

}
}


})();

(function(){
 Main2 =function(){
        return this;
      }

    Main2.prototype = {
    Main2_method1 : function(){

    },
    Main2_method2 : function(){

    }
    }
})();

var MyInstance1 = new Main1();
var MyInstance2 = new Main2();

问题:我想在另一个方法中调用一个方法。我想调用Main2_method1 in Main1_method1,但我不知道该怎么做。

我可以使用经典模型(function.prototype.method = function(){})或原型模型(object.create)。但我想使用上述方法做到这一点。

3 个答案:

答案 0 :(得分:0)

好吧,你需要在实例上调用方法:

(function(){
    Main2 =function( instance1 ) {
        this.main1 = instance1;
        return this;
     }

    Main2.prototype = {
        Main2_method1 : function() {
            this.main1.Main1_method1();
        }
    }
})();

var MyInstance1 = new Main1();
var MyInstance2 = new Main2( MyInstance1 );

您需要弄清楚的唯一部分是Main2访问Main1实例的方式。你可以简单地将它放在全球范围内,这将起作用。

但是为了保持清洁,你可能希望在实例化中在Main1内注入Main2实例。或者,使用事件中心将它们分离。

答案 1 :(得分:0)

我不确定你理解你需要什么,也不确定你自己理解它))

但如果我理解正确的话......))

(function(){

    Main1 = function(){return this};

    Main1.prototype = {
        method1 : function(){this.method1()}
    };

}());

(function(){

    Main2 = function(){return this};

    Main2.prototype = {
        method1 : function(){console.log('Eh?')}
    };

}());

var MyInstance1 = new Main1();
var MyInstance2 = new Main2();

MyInstance1.method1.call(MyInstance2);

答案 2 :(得分:-1)

在“Javascript Patterns" by Stoyan Stefanov”一书的启发下,您可以使用“公共静态成员”模式,该模式允许您为可从任何地方访问的对象定义一些特殊方法。请参阅该示例:

    // Define a first object
    var Main1 = function(){
      var method1 = function() {
        return 'Main1.Method1';
      }

      var method2 = function(){
        return "I'm Main1 method2, executing: " + Main2.Method1();
      }

      return {
        Method1 : method1,
        Method2 : method2
      }
    }

    // Define a second object
    var Main2 = function(){
      var method2 = function() {
        return 'Main2.Method1';
      }
      return {
        Method2 : method2
      }
    }
    // Add a static method to Main2
    Main2.Method1 = function(){
      return 'Main2.Method1';
    }

    // Then you can execute the static method without 
    // instantiate its object...
    console.log(Main2.Method1()); // output: Main2.Method1

    // So, this will work
    var foo = new Main1();
    console.log(foo.Method2()); //output: I'm Main2 Method2, executing: Main2.Method1

没有唯一的解决方案,但在我看来,它是最好的解决方案之一。

回到你的代码中,问题可能是你在单独的闭包中定义了两个对象。因此Main1不能使用Main2方法,因为Main2已在不同的范围内定义。