从变量动态创建命名空间对象

时间:2011-12-12 23:14:25

标签: javascript object namespaces titanium

对于我正在编写的Titanium应用程序,我构建了一种模块化方法,以便其他开发人员(当我从我的组织移动或其他人被要求添加到应用程序时)可以添加新模块应用程序很容易(不要与本机代码模块混淆)。

我很难搞清楚如何从数组中加载模块并调用常见的中央引导类型方法来初始化模块。该应用程序使用Tweetanium的作者建议的命名空间方法。

该应用使用命名空间:org.app

我已经定义了一个数组,其中包含要在应用程序中加载的已配置模块:

org.modules = [
    {
        name: 'messages',
        enabled: true,
        title: 'Messages'
    },
    {
        name: 'calendar',
        enabled: true,
        title: 'Calendar'
    }
];

每个模块都有名称空间:org.module.moduleName其中moduleName是数组中模块的名称(例如邮件或日历)。

我已经创建了一个模块目录,并且我已成功动态地为每个启用的模块包含js文件(通过专门静态调用该方法进行测试)。我需要从模块代码中调用createModuleWindow()方法来获取该模块的主视图。

org.module = {};
org.module.moduleManager = [];

// Loop through the list of modules and include the 
// main modulename.js file if enabled.
// Create the module and add it to the module manager array
var modules = org.modules;
var config = org.config;
for (var i = 0; i < modules.length; i++) {
    var _module = modules[i];
    if (_module.enabled) {
        Ti.include(config.moduleBasePath + _module.name + "/" + _module.name + '.js');
        org.module.moduleManager.push(createModuleWindow(_module.name));
    }
}

function createModuleWindow(moduleName) {
    // Not sure what to do here.
    return org.module.[moduleName].createMainWindow();
};

对于createModuleWindow(),我尝试过动态类和方括号表示法但是我只是得到像'moduleName'这样的错误不是构造函数(在使用类方法的情况下)或者是在解析错误中上述代码的情况。

如何动态调用命名空间模块方法?

2 个答案:

答案 0 :(得分:1)

您的语法错误在这里:

return org.module.[moduleName].createMainWindow();
                 ^

应该没有点:

return org.module[moduleName].createMainWindow();

其他一些说明:

  • org.module在您的示例代码中为空,因此上面的行将抛出空指针异常。 (您可能只是没有显示所有代码。)

  • 使用org.module(单数)和org.modules(复数)是不必要的混淆。我会尝试在代码中更好地区分这两者。

答案 1 :(得分:0)

您可以使用[]代替命名空间变量的属性/函数:

var obj = {
    someProperty: 'testing',
    anotherProperty: {
        testFunc: function() {
            return 'nested func';
        }

};

console.log(obj.someProperty); // logs 'testing'
console.log(obj['someProperty']); // same as above
console.log(obj['anotherProperty'].testFunc()); // logs 'nested func'
console.log(obj['anotherProperty']['testFunc']()); // same as above

所以,在你的情况下:

return org.module[moduleName].createMainWindow();

应该有效。我希望这会有所帮助。