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";
Нужно, как вы уже догадались, вызвать метод, имя которого находится в переменной.
Или наоборот, в переменной - название класса.
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) это ессесно будет:
В локальном плане (в пределах твоего 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');
В вашем случае осталось немного:
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 )
Надеюсь помог)