大家好,
我试图弄清楚,为什么Cookie模块只有在使用新操作符实例化之后才能访问.我认为,如果我在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();
}发布于 2014-10-16 12:04:26
因为Cookie是一个构造函数。你需要return new Cookie();
关于为什么new应该在this StackOverflow page上使用的原因有更多的信息。
...if您忘记了
new,您将调用对象构造函数作为常规函数。如果构造函数不检查它的执行上下文,那么它就不会注意到'this‘指向不同的对象(通常是全局对象),而不是新的实例。因此,构造函数将向全局对象(窗口)添加属性和方法。如果您总是在object函数中检查“这”是对象的一个实例,那么您就不会遇到这个问题。
发布于 2014-10-16 12:14:20
这段代码有很多问题。正如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‘define函数的模块使用了一个define配置。shim 选项仅适用于不调用的模块。如果将shim交给调用define的模块,则输入未定义的行为域,如果它有效,这只是运气。它现在可以工作,明天也可能失败,或者当RequireJS引入一个新版本时失败,它确实为调用define的模块分配了一些定义的行为。https://stackoverflow.com/questions/26403551
复制相似问题