Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вызов метода (https://javascript.ru/forum/misc/25466-vyzov-metoda.html)

Ваня в бане 06.02.2012 13:34

Вызов метода
 
У меня есть набор объектов и их методов
var notes = {
    'add':function(){}
  , 'del':function(){}
}
var store = {
    'new':function(){}
  , 'get':function(){}
}

Появилась потребность вызывать методы, получая из другого приложения строку типа 'notes.add'.

Как это можно реализовать без использования eval()? Буду очень благодарен за ответ.

irezvov 06.02.2012 13:40

var parts = 'notes.add'.split('.'),
    obj = parts[0],
    method = parts[1];
window[obj][method].call(window[obj]);

poorking 06.02.2012 13:55

Разбиваете строку например с помощью split, если вы уверены что строка всегда будет приходить валидная, получаете массив названий вложенных пространств иен. Затем начиная от корня пространства имен (если notes и store - глобальны, то это window) начинаете добираться до вашего метода и потом его вызываете.
var str = "my.deep.deep.namespace.and.method";

var pkgs = str.split("."), // Если вы не уверены что строка 100% валидная, то надо парсить регуляркой и проверять лишние точки, точки в начале, в конце и прочее, но думаю это лишнее

root= window;

for (var i = 0, l = pkgs.length; i < l; i ++) {
    root = root[pkgs[i]]; //   Тут не плохо бы проверять, есть ли на этом месте объект
}

root();


Это был грубый пример. Если вы себе сами пишете эти методы и сами себе присылаете строки, то есть вам не подсунут зловещий код 100%, пользуйтесь eval, почему нет..


Часовой пояс GMT +3, время: 08:42.