Объект окна 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.