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对象,它不会接受任何命名参数。