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

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

Как показывает этот пример, test.myFunct() не может ссылаться на вложенное example переменная:

var example = "from global";
(function (global) {
    var example = "from closure";
    global.test = {};
}(this));

test.myFunct = fnction () { return example; };
test.myFunct(); // "from global"

Поэтому я попытался создать функцию сумматора, надеясь решить проблему, но безрезультатно:

var example = "from global";
(function (global) {
    var example = "from closure";
    global.test = {
        add: function (name, value) { global.mJSON[name] = value; }
    }
}(this));

test.add("myFunct", function () { return example; });
test.myFunct(); // "from global"

Есть ли способ динамически добавлять элементы к объекту, позднее во время выполнения, которые могут ссылаться на вложенные элементы?

Почему это необходимо:

Я работаю с реализацией COM mIRC для доступа MSScriptControl.ScriptControlдвижок jScript Из-за ограничения использования mIRC, я ограничен ~4k байтами на выполнение команды из mIRC. Поэтому мне нужно разбить мой файл JS на куски размером ~3500 байт или меньше перед вызовом ScriptControl"s AddCode, ExecuteStatement, или же Eval методы.

Примечания:

Я бы предпочел не использовать статические "вспомогательные" функции, которые возвращают значения переменных / функций в приложении.

1 ответ

Решение

Есть ли способ динамически добавлять элементы к объекту, позднее во время выполнения, которые могут ссылаться на вложенные элементы?

1, что противоречило бы определению (javascript) замыкания. Просто используйте открытые свойства вместо вложенных переменных.


1: вы можете использовать eval создать новую функцию в области замыкания (из строки) и поместить ее в качестве члена. Но это чистое зло

var example = "from global";
(function (exports) {
    var example = "from closure";
    exports.addPrivileged = function(name, args, body) {
        body = arguments[arguments.length-1];
        args = Array.prototype.slice.call(arguments, 1, -1).join(", ");
        this[name] = eval("(function("+args+"){"+body+"})");
        name = args = body = null;
    };
}(test={}));

test.addPrivileged("myFunct", "return example");
console.log(test.myFunct()); // "from closure"
Другие вопросы по тегам