我应该使用方法还是子类?如果这是有道理的

时间:2012-10-30 18:49:52

标签: javascript jquery forms oop sinemacula

一点背景......

我有一个名为SineMacula的对象,其中包含许多创建表单元素的方法,并使这些表单元素在页面上执行操作。

首先,当页面加载时,调用一个名为setFields()的方法,它循环遍历页面上的所有字段并适当地设置它们 即。自动填充,复选框等......

setFields()的代码如下所示:

/**
 * Set Fields
 * This function will set all fields
 *
 * The options:
 * - fields: the fields selector to loop through
 *
 * @param object options The field options
 */
SineMacula.prototype.setFields = function (options){
    // Set the defaults for the fields
    var options = $.extend({
        fields: '.field', // Define the default field selector
    },options);
    // Loop through the fields and set the events
    $(options.fields).each(function(){
        // Set the field events
        SineMacula.setBlur($(this));        
        SineMacula.setFocus($(this));
        SineMacula.setToggleLabel($(this));
        // If the field is a checkbox then set it
        if($(this).parent().hasClass('checkbox')){
            SineMacula.setCheckbox($(this).parent());
        }
        // If the field is an autocomplete then set it
        if($(this).parent().hasClass('autocomplete')){
            SineMacula.setDropdown($(this).parent(),{source:$(this).attr('data-source')});
        }
        // etc...
    });
};

上面的大部分代码都可以忽略,但我已插入所有代码,以便您可以准确了解我在做什么。

我的问题

我有SineMaculasetCheckbox()对象的一些方法,例如setDropdown()if($(this).parent().hasClass('autocomplete')){ new SineMacula.dropdown($(this).parent(),{source:$(this).attr('data-source')}); } ......

我想知道的是,我应该将这些方法视为对象吗?

所以我的代码应该是这样的:

new

在调用dropdown()方法之前,请注意{{1}}关键字。

这是一种更好的工作方法吗?会减少使用内存等吗?

3 个答案:

答案 0 :(得分:3)

没有理由创建对象的实例只是为了调用构造函数然后抛弃对象。通过在构造函数中完成工作,您只是将它用作常规函数,但是会产生创建未使用对象的开销。

(实际上你似乎没有使用SineMacula实例,除了作为方法的名称空间。)

答案 1 :(得分:2)

作为一般经验法则,当您需要将一些责任委托给它时,会出现一个新对象。因此,如果您稍后执行类似sineMaculaInstance.setCheckboxValue(checkbox, true)的操作,那么它看起来应该是复选框责任。 查看它的另一种方法是通过Single Responsibility Principle分析SineMacula对象。简而言之,如果你能描述你的对象在一行或两行中的作用,那么你通常都可以。如果你必须编写一个完整的段落来说明SineMacula的作用,那么看起来你应该将该对象重构为对其他对象的具体分工。

HTH

答案 2 :(得分:1)

在我看来,既然你在这个SineMacula命名空间/模块中容纳了所有方法,那么重新实例化另一个全新的SineMacula对象是没有意义的。

除非您要添加想要附加到原始对象的不同/特定原型/方法,并且特定于页面上的某个部分或表单元素。< / p>

var newThing = new SineMacula('doDifferentStuff');
newThing.dropdown = '''do something different''';

实例化该类的全部原因还在于将新的this设置为调用它。看起来你拥有的一切已经捆绑在一起了,只需使用调用本身的SineMacula.setBlahblah

希望听起来不会太乱!