Javascript require.js-定义自定义模块

Javascript 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 (

大家好,

我试图弄明白,为什么Cookie模块只有在使用新操作符实例化之后才可以访问。。。 我认为,如果我在shim config中导出Cookie模块,并将模块名称添加到app.js中的per requisites中,它将是全局可访问的。但事实并非如此

你能告诉我我的模块有什么问题吗

cookie.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(); 
}
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!:)