Javascript JS显示模块模式:不应';不能由用户代码使用

Javascript JS显示模块模式:不应';不能由用户代码使用,javascript,design-patterns,architecture,revealing-module-pattern,Javascript,Design Patterns,Architecture,Revealing Module Pattern,我有一个用揭示模块模式编写的模块。它包含一个子模块,该模块可以作为重载工作。主模块的一些函数具有不应与用户代码一起使用的参数-仅通过子模块使用。如何从子模块访问参数,但使其对“外部用户代码”不可用? 我应该为这个再做一层吗 var someNamespace = someNamespace || {}; someNamespace.someModule = (function () { // _customSiteUrl, _customToken shouldn't be avai

我有一个用揭示模块模式编写的模块。它包含一个子模块,该模块可以作为重载工作。主模块的一些函数具有不应与用户代码一起使用的参数-仅通过子模块使用。如何从子模块访问参数,但使其对“外部用户代码”不可用? 我应该为这个再做一层吗

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

我不确定我是否理解正确,但如果要从面向公众的创建函数中删除参数
\u customSiteUrl
等,可以使用以下方法:

return {
    create: function( listName, data ) {
        return create( listName, data, _customSiteUrl, _customToken );
    }, 
    XS: XS,
    ...
};
这假设在子模块的范围内定义了
\u customSiteUrl
\u customToken
。基本上,您只需要让公共API调用带有额外参数的私有API


您也可以使用curry或部分应用程序函数来实现此功能,但我将由您决定。

我不确定我是否理解正确,但如果您想从面向公众的创建函数中删除参数
\u customSiteUrl
等,您可以使用以下方法:

return {
    create: function( listName, data ) {
        return create( listName, data, _customSiteUrl, _customToken );
    }, 
    XS: XS,
    ...
};
这假设在子模块的范围内定义了
\u customSiteUrl
\u customToken
。基本上,您只需要让公共API调用带有额外参数的私有API

您也可以使用curry或部分应用程序函数来实现这一点,但我将由您决定。

您只需在
中添加另一个“层”。someModule
可以在本地声明任何用户无法访问的变量,并更改返回到该层的
create:
属性,而不是基函数

您必须记住,您可以创建任意数量的“重载”,但它们都将保留您在返回的“重载”中声明的相同参数。在重载中传递给基函数(
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”,{})

您只需在
.someModule
中添加另一个“层”,并在本地声明任何用户无法访问的变量,然后更改返回到该层的
create:
属性,而不是基本函数

您必须记住,您可以创建任意数量的“重载”,但它们都将保留您在返回的“重载”中声明的相同参数。在重载中传递给基函数(
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”,{})

你不明白我的意思。见克劳斯的回答。谢谢你的时间,基本上是一样的,编码不同。Crowes还必须向
userAccessibleCreate
函数添加公共参数(参数,您需要),因为在编写时,如果不使用arguments对象,它不会接受任何命名参数。您不明白我的意思。见克劳斯的回答。谢谢你的时间,基本上是一样的,编码不同。Crowes还必须将公共参数(您想要的参数)添加到
userAccessibleCreate
函数中,因为在编写时,如果不使用arguments对象,它不会接受任何命名参数。