javascript闭包应用

感谢《JavaScript王者归来》作者月影,之前对闭包一点都不懂,看过他的书后,终于懂一点了。以下的例子是创建一个集合,这个集合可以指定数据类型,也可以不指定。另外一个each方法很有意思。

 

/**
 * 生成一个泛型的List集合
 */
function ListClassFactory(type){
   
    var data=[];
   

    var ret = function(){
       
        this.append.apply(this,arguments);
       
    }
   
    ret.base =  Array;
   
    ret.prototype= new Object();
   
    ret.prototype.append = function(){
       
        for(var i=0; i< arguments.length; i++){
           
            var element = arguments[i];
           
            if(typeof type == 'undefined'){
                data.push(element);
                continue;
            }
           
            if(typeof(element) == type || (typeof(type)=='function' && element instanceof type)){
                data.push(element);
                continue;
            }
           
            throw new TypeError("you are about to add an unavailable type of element. The specified type is /'"+ type+"/'");
        }
    }
   
    ret.prototype.toArray =  function(){
        return this.subarr.apply(this , [0,data.length]);
    }

    ret.prototype.count = function(){
        return data.length;
    }
   
    ret.prototype.get = function(i){
        return data[i];
    }
   
    //最核心的方法,循环每个元素,作为函参的参数
    //如果函参运行的返回值为false,这个返回值就不添加到新的集合中去
    ret.prototype.each = function(closure){
       
        var newListClass = ListClassFactory(ret.type);
        var newret = new newListClass();
       
        if(typeof closure =='undefined')
            closure = function(x){return x;};
       
        for(var i=0; i             var rval = closure.apply(this,[data[i]].concat(i));
            if(rval || rval === 0)
                newret.append(rval);
        }
       
        return newret;
    }
   
    //求是否所有元素都符合函参的要求
    ret.prototype.all = function(closure){
        //alert(this.count());
        return this.each.call(this,closure).count()==this.count();
    }
   
    //求是否其中一个元素符合函参的要求
    ret.prototype.any = function(closure){
        return this.each.call(this, closure).count() > 0;
    }
   
    //求是否含有指定元素
    ret.prototype.contain = function(el){
        return this.any.call(this,function(x){return x == el;});
    }
   
    //求元素下标
    ret.prototype.indexOf = function(el){
        var newList = this.each.call(this,function(x,i){
            if(x == el)
                return i;
            return false;
        });
       
        var firstElement = newList.get(0);
       
        return firstElement ? firstElement : -1 ;
    }

    //求子集
    ret.prototype.subarr = function(start,end){
        var newAry = [];
        for(var i=start; i             newAry[i] = data[i];
        }
        return newAry;
    }
   
    return ret;
   
}

 

 





js test





你可能感兴趣的:(Java阵营)