读书人

[转载] 泛泛而谈QWrap的核心机制

发布时间: 2012-10-27 10:42:26 作者: rapoo

[转载] 浅说QWrap的核心机制

/** * 函数包装器 methodize,对函数进行methodize化,使其的第一个参数为this,或this[attr]。 * @method methodize * @static * @param {function} func要方法化的函数 * @optional {string} attr 属性 * @optional {boolean} chain 串化,如果串化,返回this,否则返回原来的函数返回值 * @return {function} 已方法化的函数 */ methodize: function(func,attr,chain){ if(attr) return function(){ var ret = func.apply(null,[this[attr]].concat([].slice.call(arguments))); return chain?this:ret; }; return function(){ var ret = func.apply(null,[this].concat([].slice.call(arguments))); return chain?this:ret; }; },

?这里可以看到,methodize其实是把this给追加到参数列表的前面,即令函数的第一个参数为this。
所以: Array.prototype.forEach = methodize(ArrayH.forEach);之后,就可以直接用[].forEach了。

同样这里有两个细节的参数,第二个参数比较有用,它表示不但可以将一个function给methodize到一个对象上,还可以将其methodize到一个对象的某个属性上,这样,我就可以把一个函数methodize给一个Wrap对象。第三个参数也是为链式调用准备的,它的作用是,如果传一个true进去,那么将用this代替原来函数的返回值。

有了这三个基本的算子,我们看看可以做什么。
首先,我们可以写一组纯静态的无侵入的方法,然后将这些方法经过变换,让它们支持批量调用、Wrap和链式操作,并且methodize到某个对象、类的prototyp或者某个Wrap上去,那么我们就可以以纯粹无侵入的方式设计我们的内核,最后将它给赋予到某些外在的Wrap或者对象上去从而定制出类似于JQuery那样方便的API来,这个过程我们称之为retouch,将在下一篇文章中详细介绍。

读书人网 >Web前端

热点推荐