2013-08-14 2 views
2

Я не могу динамически вызвать частный метод add из публичной функции. Кажется, что this только обращается к общему охвату, поэтому я не могу позвонить add. Есть ли способ сделать это?Динамические вызовы частных функций объекта

function test() 
{ 
    var actionCollection = []; 

    function add(int1, int2) 
    { 
     return int1 + int2; 
    } 

    this.callFunc = function(testMethodFunction, methodArguments) 
    { 
     this[testMethodFunction].apply(null, methodArguments);//Method 'add' not found. 
    } 
} 

var t = new test(); 

alert(t.callFunc('add', [1,2])); 

Плюс я не совсем уверен, что null должен делать учитывая, что вы можете также использовать this в apply аргумента. Могу ли я также уточнить, что должен делать первый аргумент apply? Поскольку это также связано с моим первоначальным вопросом. Заранее благодарю за любую помощь!

+0

[.apply()] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) – Andreas

+0

@ Andreas Я уже прочитал, что я однако еще неясно, с какой целью первый аргумент. – Tek

+0

Первый аргумент указывает значение, доступное через функцию 'this' в функции. 'function foo() {console.log (" this.bar = "+ this.bar); } foo.apply ({bar: 5}, null); 'будет записывать' this.bar = 5' – Andreas

ответ

0

add не является частью this. Поэтому вы не можете использовать this[testMethodFunction]. Если вы хотите сохранить конфиденциальность, то вы можете использовать что-то вроде этого:

function test() { 
    var actionCollection = []; 

    var private_methods = { 
     add: function(int1, int2) { 
      return int1 + int2; 
     } 
    } 

    this.callFunc = function(testMethodFunction, methodArguments) 
    { 
     // note the change here! 
     return private_methods[testMethodFunction].apply(null, methodArguments); 
    } 
} 

var t = new test(); 

alert(t.callFunc('add', [1,2])); 
+0

Отлично, спасибо. Принято, так как это был первый правильный ответ :) – Tek

0

Это потому, что add() не является собственностью Test, это только локальная переменная в Test() закрытия.

Вот пример кода:

function Test() 
{ 
    var _priv = { 
     add: function (int1, int2) 
     { 
      console.log(int1, int2); 
      return int1 + int2; 
     } 
    }; 

    this.callFunc = function(testMethodFunction, methodArguments) 
    { 
     console.log(_priv); 
     return _priv[testMethodFunction].apply(null, methodArguments); 
    } 
} 

var t = new Test(); 

console.log(t); 

console.log(t.callFunc('add', [1,2])); 

Некоторые советы для вас:

  • ли использовать верхний регистр для класса подобных конструкций (Test вместо test)

  • Использование log() в ваших интересах для проверки объектов

Смежные вопросы