如何有效地对对象应用许多不同的规则,并使用javascript使用面向对象的技术

时间:2016-11-09 00:05:55

标签: javascript oop design-patterns

这是我第一次完成这项任务。我需要根据字段更新我的UI。该字段可以是不同类型的。这里我只是检查备忘录或布尔类型。

// UI Field Rule set.    

var UIFieldRules = {
    isMemo: function() {            
        return this.DataType === DataTypeKVP("Memo");
    },
    isBoolean: function() {
         return this.DataType === DataTypeKVP("Boolean");
    },
    MapToList: function() {
        if (UIFieldRules.isMemo.call(this) || UIFieldRules.isBoolean.call(this)) {
            console.log("memo or bool");
            console.log(UIFieldRules.isMemo.call(this));
            console.log(this);
            MAPTOLIST_SELECTOR.prop('disabled', true);
            return;
        } else {
            MAPTOLIST_SELECTOR.prop('disabled', false);
            console.log("UI field rules found memo");
        }
    }
};

然后我在加载所有字段时调用此对象。

UIFieldRules.MapToList.call(field);

这很好,并且完成了任务,但现在我需要对字段应用更多规则。 (如果你之前听过这个,请阻止我)

我如何才能获得此设置,我可以将规则添加到集合中并将它们全部动态应用于 javascript

更新提供示例:

function MapToList(field){
    isBoolean:function(){}
    isMemo : function(){}
    execute : function(){
        if (UIFieldRules.isMemo.call(this) || UIFieldRules.isBoolean.call(this)) {
            console.log("memo or bool");
            console.log(UIFieldRules.isMemo.call(this));
            console.log(this);
            MAPTOLIST_SELECTOR.prop('disabled', true);
            return;
        } else {
            MAPTOLIST_SELECTOR.prop('disabled', false);
            console.log("UI field rules found memo");
        }
    }
}

然后,如果我想创建更多规则(我这样做),我应该创建另一个像上面那样的对象吗?在JS中有这样做的最佳实践方法吗?

var rules = [];
rules.push(new MapToList(field));
rules.push(new RegExEnabled(field));

$.each(rules,function(item){
    item.execute();
});

1 个答案:

答案 0 :(得分:1)

您的示例方法完全没问题。创建所有实现相同接口的多个对象,将它们放在列表中,然后在每个对象上调用一个公共方法:

var rules = [MapToList, RegExEnabled];

rules.forEach(function(item){
    item.execute(field);
});

但是,您可能需要注意,如果您的对象没有状态或没有任何参数化,通常您不需要构造函数+ new,简单的对象文字就足够了。
同样,如果您的共享界面归结为单个execute方法,那么您实际需要的不是对象列表,而只是您可以调用的函数列表。 It's not Java: - )