Javascript AMD模式混乱 - 持久的属性值

时间:2013-11-18 21:26:45

标签: javascript requirejs

所以我试图使用requireJS来了解javascript AMD模式。我对JS的经验是有限的,毫无疑问这是妨碍我的。如果我指向“JS for Dummies”的方向,我不会感到惊讶。如果有人能够帮助我,我将非常感激。

我已经定义了一个名为“security”的模块,它具有以下定义 - 减少一点。

define(['services/storage'], function(storage) {

var security = {
    authToken: {},
    loadAuthToken: loadAuthToken,
    saveAuthToken: saveAuthToken,
};

return security;

function saveAuthToken(token) {
    if (token) {
        storage.save("DiffusrAuthToken", token);
        security.authToken = token;
    }     
};

function loadAuthToken() {       
    if (security.authToken.expires) {
        return security.authToken;
    } else {
        var token = storage.load("DiffusrAuthToken");
        security.authToken = token;
        return token;
    }
};
})

基本上我想保存模块中定义的某些值的状态,在上面的例子中,authToken。这样,当其他模块需要这个模块时,我不必去localStorage来获取它。我能让它工作的唯一方法是定义返回对象的属性,并最初将其设置为空对象。这似乎并不令人满意,因为我不想直接将它暴露给其他模块,因为它们可能会改变它。

非AMD的方式是在全局范围内定义一个对象并为其附加属性。但是,我认为AMD的重点是要避免这种情况。

问题:一般来说,我应该如何在可以从其他模块访问的模块中设置值?

1 个答案:

答案 0 :(得分:2)

您未在模块中导出的任何内容都无法在模块外部访问,但仍可在模块闭包中使用。例如,您可以创建一个var但从不将其作为security导出对象的属性附加。您可以为导出对象创建特定的访问器方法,这些方法只能以您希望模块用户的方式访问此私有变量,就像您使用saveAuthTokenloadAuthToken方法一样。

define(['services/storage'], function(storage) {

var authToken;  // private to security module

function saveAuthToken(token) {
    if (token) {
        storage.save("DiffusrAuthToken", token);
        authToken = token;  // store to private variable
    }     
};

function loadAuthToken() {       
    if (authToken.expires) {
        return authToken;
    } else {
        var token = storage.load("DiffusrAuthToken");
        authToken = token;
        return token;
    }
};

// export contains no reference to authToken
var security = {
    loadAuthToken: loadAuthToken,
    saveAuthToken: saveAuthToken,
};

return security;

});