一切都按照我的预期运作。调用模板方法只是一个错误。我错误输入了一个(),所以我尝试使用template.method而不是template()。方法;
无论如何,如果有人想解释一下这是否是一个有效的设计模式,或者我应该采取不同的方式,我将非常感激。
我读到了模块模式,我正试图在我的一些项目中实现它。问题是,在我看来,我太过扭曲了。 我受到谷歌应用程序脚本样式的启发,其中许多对象使用方法等返回其他对象,并且它们传递参数。
类似
object.method(var).otherMethod();
我想要实现的是一个接收参数的方法,将内部变量设置为该参数,然后返回一个使用该变量的方法的对象。这是一个不起作用的代码的缩小版本:
var H_UI =(function (window) {
var selectedTemplate,
compileTemplate = function(){},
parseTemplateFields = function(){};
//template subModule. Collect: collects the template fields and returns a JSON representation.
var template = function(templateString){
if(templateString) selectedTemplate = templateString;
return {
getHtml:function(){ return compileTemplate( parseTemplateFields( selectedTemplate ) ) } ,
collect:function(){
.. operating over selectedTemplate ...
return JSON.stringify(result)}
} };
return {
template:template
};
})(window);
<击> 如果我删除该行:
if(templateString) selectedTemplate = templateString;
并将selectedTemplate替换为返回对象的方法中的参数templateString,它按预期工作。我知道我不能在返回的对象中创建一个set()方法并像这样使用它
H_UI.template().set(var)
但我发现它很难看。无论如何,我认为我搞砸了。
构建它的最佳方法是什么?
击>
答案 0 :(得分:1)
如果您希望H_UI.template()
每次在其上调用template()
时都创建一个新对象,那么您的解决方案就不起作用了。因为变量selectedTemplate
仅在调用立即函数时创建一次。
但是,如果你的意图是这样,你的解决方案就可以了。 (对selectedTemplate
)的所有调用共享变量template()
。
但是如果你想每次调用template
都会创建一个新对象。请告诉我写下我的想法
答案 1 :(得分:1)
这是一种有效的设计模式还是我应该以不同的方式进行
是的,启用链接肯定是一种有效的设计模式。
但是,如果你的template()
方法返回一个新对象,那么该对象及其方法应该只依赖于它自己(包括template
调用的局部变量和参数),而不是其他任何东西。就像调用template
的父对象一样。
所以要么删除那个&#34;全球&#34; selectedTemplate
事:
var H_UI = (function () {
function compileTemplate(){}
function parseTemplateFields(){}
// make a template
function template(templateString) {
return {
getHtml: function(){
return compileTemplate(parseTemplateFields(templateString));
},
collect: function(){
// .. operating over templateString ...
return JSON.stringify(result)
}
}
}
return {template:template};
})();
或只制作一个带有全局selectedTemplate
的模块,设置器和全局方法:
var H_UI = (function () {
var selectedTemplate;
function compileTemplate(){}
function parseTemplateFields(){}
return {
template: function(templateString){
if (templateString)
selectedTemplate = templateString;
return this; // for chaining
},
getHtml: function(){
return compileTemplate(parseTemplateFields(selectedTemplate));
},
collect: function(){
// .. operating over selectedTemplate ...
return JSON.stringify(result)}
}
};
})();
当我们使用该方法制作两个模板时,差异非常明显:
var templ1 = H_UI.template("a"),
templ2 = H_UI.template("b");
您希望他们做什么?在功能设计中,templ1
不得使用"b"
。我们有第一个代码段和templ1 != templ2
。但是,如果.template()
仅仅是设置者,并且每个调用都会影响整个实例(例如第二个代码段),我们就会templ1 == H_UI
和templ2 == H_UI
。