百度前端js库分析

百度前端js库tangram已经开源一年多了。自己也一直在使用这个工具库,这个工具库使用起来是很方便的

 百度对性能要求是很好的。它对常见的操作都做些了封装和拆分,比如数组,ajax提交,dom操作,方法的操作,事件等的操作,每个函数都是静态的方法,对其他的方法没有依赖关系,可以很方便的对其中的某些功能抽取出来单独使用,同时提供了方法定义和自动抽取的工具,这个都是可以实现的。我觉得对方法的操作,语言层面的封装,事件的封装,dom的操作都挺好的,下面来着重来分析下这些方法的实现方式。

 

1)对方法的封装。提供baidu.fn这个对象

(1)定义了抽象方法abstractMethod 

 baidu.fn.abstractMethod = function() {

    throw Error('unimplemented abstract method');
};

(2)为对象绑定方法和作用域baidu.fn.bind,利用这个方法可以很容易的将某个方法和作用域绑定在对象上。

baidu.fn.bind = function(func, scope) {
    var xargs = arguments.length > 2 ? [].slice.call(arguments, 2) : null;
    return function () {
        var fn = baidu.lang.isString(func) ? scope[func] : func,
            args = (xargs) ? xargs.concat([].slice.call(arguments, 0)) : arguments;
        return fn.apply(scope || fn, args);
    };

}; 

(3)定义了一个空函数blank,主要用于作用域链被污染的情况。

(4) 将一个静态方法变成一个对象的方法,使他成为这个对象的方法,使其第一个参数了this或者this[attr]

baidu.fn.methodize = function (func, attr) {
    return function(){
        return func.apply(this, [(attr ? this[attr] : this)].concat([].slice.call(arguments)));
    }; 
};
(5)函数集化的方法 multize

 baidu.fn.multize = /**@function*/function (func, recursive, joinArray) {

    var newFunc = function(){
        var list = arguments[0],
            fn = recursive ? newFunc : func,
            ret = [],
            moreArgs = [].slice.call(arguments,0),
            i = 0,
            len,
            r;
        if(list instanceof Array){
            for(len = list.length; i < len; i++){
                moreArgs[0]=list[i];
                r = fn.apply(this, moreArgs);
                if (joinArray) {
                    if (r) {
                        //TODO: 需要去重吗?
                        ret = ret.concat(r);
                    }
                } else {
                    ret.push(r);
                }
            }
            return ret;
        }else{
            return func.apply(this, arguments);
        }
    }
    return newFunc;
}; 

 

 

未完待续,明天继续。

 

posted @ 2012-03-05 23:54  yupeng  阅读(3233)  评论(0编辑  收藏  举报