首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >require.js -定义自定义模块

问require.js -定义自定义模块
EN

Stack Overflow用户
提问于 2014-10-16 11:44:22
回答 2查看 521关注 0票数 0

大家好,

我试图弄清楚,为什么Cookie模块只有在使用新操作符实例化之后才能访问.我认为,如果我在shim中导出Cookie模块,并将模块名添加到app.js中的必备项中,那么它将是全局访问的。但事实并非如此。

你能告诉我的模块可能出了什么问题吗?

cookie.js

代码语言:javascript
复制
define("Cookie",function (){
    function Cookie()
    {}

    Cookie.prototype.add = function ()
    {
        doStuff();
    }

    Cookie.prototype.remove = function ()
    {
        doStuff();
    }

    return Cookie;
});

main.js

代码语言:javascript
复制
requirejs.config({
    baseUrl: 'js/lib',
    paths: {
        app: '../app',
    },
    shim:{
        Cookie: {
            exports : 'Cookie'
        }
    }
});

app.js

代码语言:javascript
复制
define(['Cookie'],function(Cookie)
{
    Cookie.add(); 
    Cookie.remove(); 
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-16 12:04:26

因为Cookie是一个构造函数。你需要return new Cookie();

关于为什么new应该在this StackOverflow page上使用的原因有更多的信息。

...if您忘记了new,您将调用对象构造函数作为常规函数。如果构造函数不检查它的执行上下文,那么它就不会注意到'this‘指向不同的对象(通常是全局对象),而不是新的实例。因此,构造函数将向全局对象(窗口)添加属性和方法。如果您总是在object函数中检查“这”是对象的一个实例,那么您就不会遇到这个问题。

票数 0
EN

Stack Overflow用户

发布于 2014-10-16 12:14:20

这段代码有很多问题。正如Andy所指出的,定义Cookie的方式需要实例化它。如果您希望您的应用程序中只有一个Cookie实例,那么可以指定return new Cookie(),但是如果您想要创建许多实例,那么return Cookie就是要做的事情,然后在导入它的每个模块中使用new Cookie,无论何时您需要创建Cookie实例。

但是,您在问题中显示的代码还有以下其他问题:

  1. 您的文件名为cookie.js,但您将其定义为Cookie,大写不同。经验法则: RequireJS是区分大小写的,所以文件和模块名应该相对应,除非您在其他地方重写它,这在您显示的代码中不是这样的。
  2. 您使用define('Cookie',它为您的模块指定名称Cookie。RequireJS的文档非常清楚地建议不要手动分配模块名称。优化时,r.js将指定名称。或者,如果不进行优化,那么RequireJS将从文件名中分配模块名。当您进行优化时,如果您已经指定了一个名称,r.js就无法完成它的工作。(是的,有时候你想自己指定名字,但是如果你不能给出一个具体的原因,为什么在一个特定的例子中你需要自己设置名字,那么很可能是你做错了。)
  3. 您对调用shim‘define函数的模块使用了一个define配置。shim 选项仅适用于不调用的模块。如果将shim交给调用define的模块,则输入未定义的行为域,如果它有效,这只是运气。它现在可以工作,明天也可能失败,或者当RequireJS引入一个新版本时失败,它确实为调用define的模块分配了一些定义的行为。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26403551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档