妙用字面量对象来设计代码
最近一直在学习一些巧妙的设计代码编写的技巧,比如:单例模式,模块模式,类模式,字面量模式等等。其中单例模式、模块模式的写法又可以根据不同的特点有几种不同的变体。哈哈,有点走题了,本文主要说的不是这些,而是怎样利用字面量对象来设计代码。
当初利用三元运算符来代替多个if的逻辑,使得代码看起来简单,虽然牺牲了一点代码可读性,但是代码看起来没有那么臃肿了。对于if逻辑多的时候,可以使用switch来代替众多的if…else if逻辑,但是对于每一个分支比较复杂或者是很类似的时候,看到switch…case一连串,也感觉不爽,那么就是用字面量对象来代替吧,就如我下面所写的那样:
var checkFn=function(operation){
return {
'=':function(e) { return (e.getAttribute(attr) == attrValue); },
'~':function(e) { return (e.getAttribute(attr).match(new RegExp('\\b'+attrValue+'\\b'))); },
'|':function(e) { return (e.getAttribute(attr).match(new RegExp('^'+attrValue+'-?'))); },
'^':function(e) { return (e.getAttribute(attr).indexOf(attrValue) == 0); },
'$':function(e) { return (e.getAttribute(attr).lastIndexOf(attrValue) == e.getAttribute(attr).length - attrValue.length); },
'*':function(e) { return (e.getAttribute(attr).indexOf(attrValue) > -1); },
'a':function(e) { return e.getAttribute(attr);}
}[operation];
}
上面就可以避免使用switch来罗列基于operation的分支了,代码简洁多了。很多时候,利用字面量对象可以很巧妙地去处理if等判断逻辑,使得程序无需判断,就可以直接通过字面量对象得到想要的结果。下面是摘自MoolTools库开头的一段代码,读起来很顺畅,也很巧妙:
//用于给对象添加静态方法
Native.genericize = function(object, property, check){
if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function(){
var args = Array.prototype.slice.call(arguments);
return object.prototype[property].apply(args.shift(), args);
};
};
//用于给对象添加type属性
Native.typize = function(object, family){
if (!object.type) object.type = function(item){
return ($type(item) === family);
};
};
//具体的实现过程
;(function(){
var natives = {'Array': Array, 'Date': Date, 'Function': Function, 'Number': Number, 'RegExp': RegExp, 'String': String};
for (var n in natives) new Native({name: n, initialize: natives[n], protect: true});
var types = {'boolean': Boolean, 'native': Native, 'object': Object};
for (var t in types) Native.typize(types[t], t);
var generics = {
'Array': ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"],
'String': ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"]
};
for (var g in generics){
for (var i = generics[g].length; i--;) Native.genericize(natives[g], generics[g][i], true);
}
})();
别看上面的代码多,也别看它这样做是否合理,其实它已经很好的处理了使用相应的原型的方法来实现静态方法,它的实现方式感觉不错,看起来有种恍然一亮的感觉,思维上可以借鉴的地方很多。
字面量对象还可以做很多其他的事情,来简化代码的编写,有待你去发觉,^_^。
扩展阅读:《Organizing Javascript code》、《How I write JavaScript Widgets》、《http://www.klauskomenda.com/code/javascript-programming-patterns/(需要翻墙)》