我有一个模块的代码:
define(
[
"jquery",
],
function
(
$
)
{
this.someArray = []
this.someObject =
function(
someID
somePrivacyType
)
{
this.someID = someID;
this.somePrivacyType = somePrivacyType;
someArray[this.someID] = this;
};
return this;
}
);
我想从另一个模块使用它的命名空间访问上面的模块,但使用return this;
会抛出全局命名空间中的所有内容。
如此:
define(
[
"jquery",
"myProject/SomeModule"
],
function
(
$,
SomeModule
)
{
console.log(SomeModule); //Returns window
//someArray is in the global namespace rather than only
console.log(someArray); //Returns someArray (Want it to return undefined)
//on the SomeModule namespace below
console.log(SomeModule.someArray); //Returns someArray (Want only this to return Array)
console.log(SomeModule.someObject);
return this;
}
);
我想继续使用某种类型的return this;
,而不必在模块本身内声明命名空间。通过这种方式,我可以很容易地通过在模块中声明私有变量来保留私有变量,而不是this
。我知道我可以简单地从模块中声明命名空间,但这会消除模块性。
有没有办法从RequireJS中提取文件的命名空间或以其他方式返回this
作为一个对象,该对象只能被调用它的名称空间引用?
答案 0 :(得分:1)
我建议如下:
define(["jquery"], function ($) {
var ns = {}; // Create our namespace.
ns.someArray = [];
ns.someObject = function(someID, somePrivacyType) {
this.someID = someID;
this.somePrivacyType = somePrivacyType;
ns.someArray[this.someID] = this;
};
return ns;
});
我假设ns.someObject
是用new
调用的。我还假设您在分配给someArray
的函数中对ns.someObject
的访问权限是为了访问您的命名空间中的someArray
,因此ns.someArray
。
根据命名空间的性质,您可能希望使用Object.create(null)
来创建它,而不是{}
。当你拥有一组有限的密钥并且注意不要覆盖{}
上定义的方法时,Object
是可以的。如果没有,最好使用Object.create(null)
来避免冲突。