Объект окна Javascript, вызов функции из массива пространств имен

Пример кода: (Пожалуйста, не eval())

    var stringReference = "obj.inner.method";
    var namespace = stringReference.split(".");

    // Now I need to Call window[namespace].call();

Я немного сбит с толку относительно того, как создать вызов функции. Конечный результат должен выглядеть так?

    window[obj][inner][method].call();

Контекст:

    <div data-attribute="click:obj.inner.method" > </div>

Я беру атрибут данных и привязываю слушателей событий на основе атрибута данных. Также спасибо заранее.

4 ответа

Решение

Попробуйте что-то вроде этого:

function getNamespace(base, path) {
    path = path.split('.');
    for (var i = 0; i < path.length; i++) {
        base = base[path[i]]
    }
    return base;
}

Используйте это как:

getNamepspace(window, 'obj.inner.method');

Вы можете сделать рекурсивную функцию, такую ​​как

function getProp(obj, keys) {
    if (keys.length) return getProp(obj[keys.shift()], keys);
    return obj;
}

А потом

getProp(window, 'document.body'.split('.')); // <body>

Цикл также будет работать, в этом случае вы могли бы написать его как

function getProp(obj, keys) {
    var k;
    while (keys.length) k = keys.shift(), obj = obj[k];
    return obj;
}

Обратите внимание, в этих примерах я использую shift который имеет побочные эффекты.

Я полагаю, вы могли бы сделать что-то вроде этого:

var namespaces = stringReference.split(".");
var reference = window;
var i = 0;
do {
    reference = reference[namespaces[i]];
    i++;
} while(reference && i < namespaces.length);

if(reference) {
    reference.call();
}

Вы даже можете инкапсулировать внутри функции:

function getNamespacedObject(root, path) {
    var paths = path.split(".");
    var reference = root;

    var i = 0;
    do {
        reference = reference[namespaces[i]];
        i++;
    } while(reference && i < namespaces.length);

    return reference;
}

Вы можете позвонить через var obj = getNamespacedObject(window, "my.namespaced.object");,

Еще одно предложение, основанное на "sp0rkyd0rky" и "Paul S." из них:

function fetch(base, path) {
    if (!path) { path = base; base = window; }
    path = path.split('.');
    while (path.length) base = base[path.shift()];
    return base;
}

base параметр является необязательным и относится к window по умолчанию:

fetch(window, 'obj.inner.method') === fetch('obj.inner.method'); // true

Вы также можете взглянуть на этот ответ: /questions/11250377/javascript-poluchit-put-k-svojstvu-obekta/11250393#11250393. Однако есть много недостатков, которые вы должны учитывать (безопасность, производительность, ремонтопригодность, отладка...): /questions/13544651/yavlyayutsya-li-eval-i-new-function-odinakovyimi/13544677#13544677.

Другие вопросы по тегам