2013-12-18 3 views
0

Я пытаюсь управлять своим кодом в javascript. Что я сделал, создано два класса.oops in 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-polluted – 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 

Eсть не единственное решение, но, на мой взгляд, оно одно из лучших.

В вашем коде, возможно, проблема в том, что вы определили два объекта в отдельных затворах. Поэтому 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); 
Смежные вопросы