我正在尝试将一个define模块方法添加到我的顶级命名空间,该命名空间首先定义命名空间。例如,
APP.define('modules.moduleName', function () {
return {name: 'Module 1' };
});
但似乎在我的实现中,存在一个分配问题。这是我实现的简化示例。
var APP = APP || {};
APP.namespace = function( nsString ) {
var parts = nsString.split('.'),
parent = this,
i;
if (parts[0] === 'APP') {
parts = parts.slice(1);
}
for ( i = 0; i < parts.length; i++ ) {
if (typeof parent[parts[i]] === 'undefined') {
parent[parts[i]] = {};
}
parent = parent[parts[i]];
}
return parent;
};
// Simplified example of my define function
APP.define = function( name, definition ) {
var namespace = APP.namespace( name );
namespace = definition();
return namespace;
};
// Example Module
APP.define('modules.example', function () {
return {
name : 'Application',
module : 'APP.module'
};
});
但是,在将命名空间分配给definition()
后,似乎未在APP命名空间下分配命名空间。但是var module = APP.define('module.example', function () { /*...*/ })
有效。这也有效:
APP.define = function( name, definition ) {
var namespace = APP.namespace( name );
var module = definition();
for (var prop in module) {
if (module.hasOwnProperty[prop]) {
namespace[prop] = module[prop];
}
}
return namespace;
};
必须有一些关于对象引用或回调范围的内容我不知道。
答案 0 :(得分:0)
当您将var命名空间分配给APP.namespace(name)时,您将通过引用获取命名空间的最后一部分,但是namespace = definition()
只是将您的命名空间变量重新定义为definition
函数的结果。
您可以合并APP.namespace
和APP.define
,以便您的前一个父级将名称空间的最后一部分作为属性分配给definition
函数
代码是:
var APP = APP || {};
APP.define = function( nsString, definition) {
var parts = nsString.split('.'),
parent = this,
i;
if (parts[0] === 'APP') {
parts = parts.slice(1);
}
for ( i = 0; i < parts.length - 1; i++ ) {
if (typeof parent[parts[i]] === 'undefined') {
parent[parts[i]] = {};
}
parent = parent[parts[i]];
}
parent[parts.pop()] = definition();
};