2013-12-18 51 views
0

我想在javascript中管理我的代码。我做了什么创建了两个类。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(); 

问:我想援引another.I一个方法要调用Main2_method1 in Main1_method1,但我不知道该怎么做。 。

我可以使用经典模式(function.prototype.method = function(){})或原型模型(object.create),但我想这样做,用上面的方法

+0

您的所有功能缺失var关键字,它们是全局的,应该可以从任何地方访问,只要它们是在您打算使用它们时定义的。 – adeneo

+0

@adeneo:..使用var会让我的代码更加复杂?这是一个很好的方式来编码 –

+0

http://stackoverflow.com/questions/8862665/what-does-it-mean-global-namespace-would-be-pluluted – isherwood

回答

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实例化。或者,您使用事件中心让它们分离。

+0

dint明白......这是一个正确的方法假设它是var Main1和var Main2 –

+0

简单地理解你需要像这样调用实例的方法:'MyInstance1.Main1_method1()' –

+0

之后,你需要确保'Main2'类可以访问MyInstance1'变量。为此,我列出了一些应该用来保持代码清洁和维护的模式。 –

-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已被定义在不同的范围内。

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); 
相关问题