JS 揭示模块模式:用户代码不应使用的参数

JS Revealing module pattern: Params that shouldn't be used by usercode

我有一个用揭示模块模式编写的模块。这包含一个作为重载工作的子模块。主模块的一些函数具有不应与用户代码一起使用的参数 - 只能通过子模块使用。我怎样才能从子模块访问参数但使它们对 "external usercode" 不可用? 我应该为此再做一层吗?

var someNamespace = someNamespace || {};

someNamespace.someModule = (function () {

    // _customSiteUrl, _customToken shouldn't be available via usercode
    function create(listName, data, _customSiteUrl, _customToken) {
        ...
    }
    var XS = (function () {
        return {
            createXS: function (siteUrl, listName, data) {
                ...
                create(listName, data, siteUrl, token);
            }
        }
    })();

    return {
        create: create,
        XS: XS,
        ...
    }
})();

someNamespace.someModule.create("hi", {}, "https://...", "someHash"); //Should not be possible!!
someNamespace.someModule.create("hi", {}); //Should be used

我不确定我是否理解正确,但是如果你想从面向public的创建函数中删除参数_customSiteUrl等,你可以使用类似:

return {
    create: function( listName, data ) {
        return create( listName, data, _customSiteUrl, _customToken );
    }, 
    XS: XS,
    ...
};

这假设 _customSiteUrl_customToken 是在子模块的范围内定义的。您基本上只需要 public API 使用额外参数调用私有 API。

您也可以为此使用 curry 或部分应用程序函数,但我会把它留给您。

您只需在您的 .someModule 中添加另一个 "layer" 并在本地声明任何 user-inaccessible 变量,然后更改您的 create: 属性 return到这一层,而不是基本功能。

您必须记住,您可以创建任意多个 "overloads",但它们都将保留您在 "overload" 中声明的相同参数,您 return荷兰国际集团您在重载中传递给基本函数 (create) 的内容完全取决于您并且完全是私有的。

someNamespace.someModule = (function () {

    // _customSiteUrl, _customToken shouldn't be available via usercode
    function create(listName, data, _customSiteUrl, _customToken) {
        ...
    }

    function userAccessibleCreate () {
        return create(parameters, you, want);
    };
    var XS = (function () {
        return {
            createXS: function (siteUrl, listName, data) {
                ...
                create(listName, data, siteUrl, token);
            }
        }
    })();

    return {
        create: userAccessibleCreate,
        XS: XS,
        ...
    }
})();

现在,用户只能做someNamespace.someModule.create("hi", {});