Javascript require.js-定义自定义模块
大家好, 我试图弄明白,为什么Cookie模块只有在使用新操作符实例化之后才可以访问。。。 我认为,如果我在shim config中导出Cookie模块,并将模块名称添加到app.js中的per requisites中,它将是全局可访问的。但事实并非如此 你能告诉我我的模块有什么问题吗 cookie.jsJavascript require.js-定义自定义模块,javascript,requirejs,Javascript,Requirejs,大家好, 我试图弄明白,为什么Cookie模块只有在使用新操作符实例化之后才可以访问。。。 我认为,如果我在shim config中导出Cookie模块,并将模块名称添加到app.js中的per requisites中,它将是全局可访问的。但事实并非如此 你能告诉我我的模块有什么问题吗 cookie.js define("Cookie",function (){ function Cookie() {} Cookie.prototype.add = function (
define("Cookie",function (){
function Cookie()
{}
Cookie.prototype.add = function ()
{
doStuff();
}
Cookie.prototype.remove = function ()
{
doStuff();
}
return Cookie;
});
requirejs.config({
baseUrl: 'js/lib',
paths: {
app: '../app',
},
shim:{
Cookie: {
exports : 'Cookie'
}
}
});
define(['Cookie'],function(Cookie)
{
Cookie.add();
Cookie.remove();
}
main.js
define("Cookie",function (){
function Cookie()
{}
Cookie.prototype.add = function ()
{
doStuff();
}
Cookie.prototype.remove = function ()
{
doStuff();
}
return Cookie;
});
requirejs.config({
baseUrl: 'js/lib',
paths: {
app: '../app',
},
shim:{
Cookie: {
exports : 'Cookie'
}
}
});
define(['Cookie'],function(Cookie)
{
Cookie.add();
Cookie.remove();
}
app.js
define("Cookie",function (){
function Cookie()
{}
Cookie.prototype.add = function ()
{
doStuff();
}
Cookie.prototype.remove = function ()
{
doStuff();
}
return Cookie;
});
requirejs.config({
baseUrl: 'js/lib',
paths: {
app: '../app',
},
shim:{
Cookie: {
exports : 'Cookie'
}
}
});
define(['Cookie'],function(Cookie)
{
Cookie.add();
Cookie.remove();
}
因为
Cookie
是一个构造函数。您需要返回新的Cookie()代码>
关于在上使用new
的原因,有更多信息
…如果您忘记了[new
],您将作为常规函数调用对象构造函数。如果您的构造函数没有检查其执行上下文,那么它不会注意到“this”指向不同的对象(通常是全局对象),而不是新实例。因此,构造函数将向全局对象(窗口)添加属性和方法。如果您总是在对象函数中检查“this”是您的对象的实例,那么您就不会有这个问题
这段代码有很多问题。正如Andy所指出的,定义Cookie
的方式需要实例化它。如果您希望应用程序中只有一个Cookie
实例,则会指示是,return new Cookie()
,但如果您希望创建多个实例,则需要执行return Cookie
操作,然后在导入它的每个模块中使用new Cookie
,需要创建Cookie
实例的任何时候
但是,问题中显示的代码还存在以下问题:
您的文件名为cookie.js
,但您将其定义为cookie
,大小写不同。经验法则:RequireJS区分大小写,因此文件和模块名应该对应,除非您在其他地方以某种方式重写它,而在您显示的代码中并非如此
您可以使用define('Cookie'
,它将名称Cookie
分配给您的模块。RequireJS的文档非常明确地建议不要手动分配模块名称。r.js
将在您优化时分配名称。或者,如果您没有优化,则RequireJS将从文件名中分配模块名称。当您进行优化时,如果您有ame已分配,r.js
无法完成其工作。(是的,有时您希望自己分配名称,但如果您无法说出具体原因,说明在特定情况下需要自己设置名称,则很可能是您做错了。)
对于调用RequireJS'define
函数的模块,您可以使用shim
配置。该shim
选项仅适用于未调用define
的模块。如果为调用define
的模块提供shim
,则输入未定义的行为区域,如果该选项有效,这只是运气。它可能现在起作用,明天就会失败,或者当RequireJS引入一个新版本时,它可能会失败,该版本确实为调用define
的模块指定了一些已定义的行为来使用shim
因为Cookie
是一个构造函数。你需要返回新的Cookie
。没错,现在一切都正常了,Cookie Monster会以你为荣:)。Soz,确保它是返回新的Cookie()
@Wrackercan您可以发布答案而不是添加其他帖子吗?否则我可以将您的答案标记为解决方案。感谢您保存所有cookies!:)