大家好,
我想弄清楚,为什么Cookie模块只有在使用new运算符实例化后才可访问... 我想如果我在shim配置中导出Cookie模块并将模块名称添加到 app.js 中的必备条件,那么它将是全局可访问的。但事实并非如此。
您能否告知我的模块可能出现的问题?
cookie.js
define("Cookie",function (){
function Cookie()
{}
Cookie.prototype.add = function ()
{
doStuff();
}
Cookie.prototype.remove = function ()
{
doStuff();
}
return Cookie;
});
main.js
requirejs.config({
baseUrl: 'js/lib',
paths: {
app: '../app',
},
shim:{
Cookie: {
exports : 'Cookie'
}
}
});
app.js
define(['Cookie'],function(Cookie)
{
Cookie.add();
Cookie.remove();
}
答案 0 :(得分:2)
此代码存在许多问题。正如Andy指出的那样,定义Cookie
的方式需要实例化它。如果您希望应用程序中只有一个Cookie
实例,那么会指示return new Cookie()
,但是如果您想要创建多个实例,则需要return Cookie
,然后您只要您需要创建new Cookie
个实例,就可以在导入它的每个模块中使用Cookie
。
但是,您在问题中显示的代码存在以下其他问题:
您的文件名为cookie.js
,但您将其定义为Cookie
,大写不同。经验法则:RequireJS区分大小写,因此文件和模块名称应该对应,除非以某种方式将其覆盖在其他地方,这在您显示的代码中不是这样。
您使用define('Cookie'
,为您的模块指定名称Cookie
。 RequireJS的文档非常清楚地建议不要手动分配模块名称。优化后,r.js
将指定名称。或者,如果您不进行优化,则RequireJS将从文件名中分配模块名称。优化后,如果您已经分配了名称,r.js
将无法正常工作。 (是的,有时您想自己分配名称,但如果您无法在特定实例中命名具体原因,则需要设置名称你自己,那很可能是你做错了。)
您使用shim
配置来调用RequireJS' define
功能。 shim
选项仅适用于未调用define
的模块。如果您向调用shim
的模块提供define
,则输入未定义的行为区域,如果有效,那就是运气。它可能现在可以正常工作但明天就会失败,或者当RequireJS引入新版本 为调用shim
的模块使用define
指定一些已定义的行为时,它可能会失败。
答案 1 :(得分:0)
因为Cookie
是构造函数。您需要return new Cookie();
有关this StackOverflow page上应使用new
的原因的详细信息。
...如果忘记[
new
],您将调用对象构造函数作为常规函数。如果构造函数没有检查其执行上下文,那么它将不会注意到“this”指向不同的对象(通常是全局对象)而不是新实例。因此,构造函数将向全局对象(窗口)添加属性和方法。如果你总是在对象函数中检查'this'是你对象的一个实例,那么你就不会遇到这个问题。