叶落为重生每片落下的叶子都是为了下一次的涅槃...^_^

关于wrapper和chain

随手而记...

在某些有规律的对特定形式的元素或者对象操作时。wrap对于api的调用有很意想不到的作用。

简易包装:

/**
* $wrap {给一对象打包装}
* @author horizon(岑安)
*/

var $wrap = function (obj) {
//private temp object
var _obj = obj,
toString
= Object.prototype.toString,
slice
= Array.prototype.slice,
unshift
= Array.prototype.unshift,
// define the wrpper
wrapper = function (o) { this._wrapped = o };

obj
= function (o) { return new wrapper(o) }

var result = function (o, chain) { return chain ? obj(o).chain() : o; };
obj.prototype
= wrapper.prototype;

for (var key in _obj) {
if (toString.call(_obj[key]) == '[object Function]') {
obj[key]
= _obj[key];
wrapper.prototype[key]
= (function (name, func) {
return function () {
var args = slice.call(arguments);
unshift.call(args,
this._wrapped);
return result(func.apply(obj, args), this._chain);
}
})(key, _obj[key])
}
}

// define the chain, return this
wrapper.prototype.chain = function () { this._chain = true; return this; }
// define the end(), return _wrapped
wrapper.prototype.end = function () { delete this._chain; return this._wrapped }

return obj;
};

例1:

var Num = {};
Num.plus
= function (a, b) { return (a + b) };
Num.substract
= function (a, b) { return (a - b) };
Num.multipy
= function (a, b) { return (a * b) };
Num.devide
= function (a, b) { return (a / b) };
Num
= $wrap(Num);

于是:

Num.plus(3, 4) // 7
Num(3).plus(4) // 7

// (3+4)*2-1
Num(3).chain()
.plus(
4)
.multipy(
2)
.substract(
1)
.end()
// 13

例2:  

var dom = {};
dom.hasClass
= function (ele,cls) {
return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
};
dom.addClass
= function (ele,cls) {
if (!this.hasClass(ele,cls)) ele.className += " "+cls;
return ele;
};
dom.removeClass
= function (ele,cls) {
if (this.hasClass(ele,cls)) {
var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
ele.className
=ele.className.replace(reg,' ');
}
return ele;
};
dom.setStyle
= function ...
dom.animate
= function ...
...

dom
= $wrap(dom);


// <div id="test" class="one"></div>
var el = document.getElementById('test');
dom(el).chain().
.addClass(
'two')
.removeClass(
'one')
...
.end();
// <div id="test" class="two"></div>

  

有局限性,适合于对同样性质的元素做类似操作时。比如 操作数组, dom元素等

 

  

 

posted on 2011-09-10 14:30  岑安  阅读(2032)  评论(1编辑  收藏  举报

导航