具有方法的模块模式setter

时间:2014-05-17 13:49:05

标签: javascript

编辑:

一切都按照我的预期运作。调用模板方法只是一个错误。我错误输入了一个(),所以我尝试使用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)

但我发现它很难看。无论如何,我认为我搞砸了。 构建它的最佳方法是什么?

2 个答案:

答案 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_UItempl2 == H_UI