Javascript AMD模式混淆-持久化属性值



因此,我正试图使用requireJS了解javascript AMD模式。我在JS方面的经验是有限的,毫无疑问这就是阻碍我的原因。如果我被指向"傻瓜JS"的方向,我不会感到惊讶。如果有人能帮助我,我将不胜感激。

我定义了一个名为"安全性"的模块,它有以下定义——减少一点。

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的全部目的是避免这种情况。

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

任何未在模块中导出的内容都不能在模块外部访问,但在模块闭包中仍然可用。例如,您可以创建一个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;
});

最新更新