JavaScript « Как вызвать метод по названию?

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .javascript.geshi_code {font-family:monospace;} .javascript.geshi_code .imp {font-weight: bold; color: red;} .javascript.geshi_code .kw1 {color: #000066; font-weight: bold;} .javascript.geshi_code .kw2 {color: #003366; font-weight: bold;} .javascript.geshi_code .kw3 {color: #000066;} .javascript.geshi_code .co1 {color: #006600; font-style: italic;} .javascript.geshi_code .co2 {color: #009966; font-style: italic;} .javascript.geshi_code .coMULTI {color: #006600; font-style: italic;} .javascript.geshi_code .es0 {color: #000099; font-weight: bold;} .javascript.geshi_code .br0 {color: #009900;} .javascript.geshi_code .sy0 {color: #339933;} .javascript.geshi_code .st0 {color: #3366CC;} .javascript.geshi_code .nu0 {color: #CC0000;} .javascript.geshi_code .me1 {color: #660066;} .javascript.geshi_code span.xtra { display:block; }

function a() {

    this.b = function(val) {
        alert(val);
    }

    this.c = function(val) {
        alert(val);
    }

}

var clss = new a();
// название метода
var mthd = "b";
 

Нужно, как вы уже догадались, вызвать метод, имя которого находится в переменной.
Или наоборот, в переменной - название класса.

1 ответов


Конечно же, есть обычный "ивал", от использования которого я бы отказался. Eval = Evil :)
Пожалуй, самое слабая и сомнительная область моего любимого языка это - eval().

Давайте поразмшыляем.
Знаете ли вы, что:

  • Функции в JS являются "одноклассовыми" объектами? И они могут быть свойствами объекта (в этом случае их называют методами) или даже быть элементами массива
  • Если вы не определяете, методом чего является функция, то она все равно будет доступна в глобальном плане (не абстрактно, как бы вы подумали, а именно доступна от самого корневого объекта модели DOM) в пределах браузера. Браузер - это window (да-да, эдакий глобальный namespace).
  • Объекты и массивы взаимосвязаны. То есть вместо использования обращения к объекту через [] вы можете воспользоваться точкой (.) или наоборот


То есть, смею предположить, то в твоем случае можно точно так же использовать обращение к методу-функции не через точку, как это принято в учебниках, но через скобки.

В глобальном плане это будет что-то вроде
window["functionName"]();

В локальном плане (в пределах твоего nameSpace) это ессесно будет:
myNameSpace["functionName"]();

В вашем случае осталось немного:

function a() {
    this.b = function(val) {
        alert(val + ' in scope b');
    }
    this.c = function(val) {
        alert(val + ' in scope с');
    }
}

var clss = new a();
var mthd = "c";
// Теперь просто получаем метод через переменную
var func = clss[mthd];
func('get a trick');
 

Самый простой способ заключается в использовании функции eval:


...
var calling="method_name";
eval(mathod_name+"()");
...
 
Естественно, в eval Вы можете создавать произвольный код)
Например, можете вызвать метод в контексте другого объекта с помощью функции call и apply (посмотреть можно тут http://javascript.ru/Function/call и тут http://javascript.ru/Function/apply )

Надеюсь помог)