2013-12-18 90 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); 
相關問題