我有一个名为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()
方法之前,请注意{{1}}关键字。
这是一种更好的工作方法吗?会减少使用内存等吗?
答案 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
。
希望听起来不会太乱!