4

一点背景...

我有一个名为的对象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...
    });
};

上面的大部分代码都可以忽略,但我已经插入了所有代码,这样你就可以准确地看到我在做什么。

我的问题

我有很多SineMacula对象的方法,例如setCheckbox()setDropdown()...

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

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

if($(this).parent().hasClass('autocomplete')){
     new SineMacula.dropdown($(this).parent(),{source:$(this).attr('data-source')});
}

在调用方法之前注意new关键字。dropdown()

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

4

3 回答 3

3

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

(事实上​​,除了作为方法的命名空间之外,您似乎也没有将 SineMacula 实例用于任何用途。)

于 2012-10-30T19:00:10.857 回答
2

作为一般经验法则,当您需要将一些责任委派给它时,会出现一个新对象。因此,如果您以后做类似的事情,sineMaculaInstance.setCheckboxValue(checkbox, true)那肯定看起来应该是复选框的责任。另一种看待它的方法是通过Single Responsibility Principle分析 SineMacula 对象。简而言之,如果您可以用一两行来描述您的对象的作用,那么您通常就可以了。如果您必须写一个完整的段落来说明 SineMacula 所做的事情,那么看起来您应该将该对象重构为将具体职责拆分为其他对象。

高温高压

于 2012-10-30T19:24:38.427 回答
1

在我看来,由于您将所有方法都包含在此SineMacula名称空间/模块中,因此重新实例化另一个全新的 SineMacula 对象是没有意义的。

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

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

实例化类的全部原因也是将 new 设置this为您从中调用它的任何内容。看起来你所拥有的一切都已经捆绑在一起了,并且只是使用SineMacula.setBlahblahof 调用自身。

希望这听起来不会太乱!

于 2012-10-30T19:11:58.807 回答