21_面向对象程序设计(原型【四】自己实现each方法可遍历多维数组)

原型的另外一个作用就是扩展对象中的属性和方法的
    示例:模拟Array中each循环方法,类似ECMA中的forEach方法

//使用原型扩展数组的each方法
//ECMA5 forEach循环遍历数组只能遍历多维数组时会把多维数组做为一项
var arr = [1, 2, 3, [4, [5, [6]]]];
arr.forEach(function(currentValue, index, array) {
    console.info(currentValue);
});

Array.prototype.each = function(fn){
    try{
        //1 目的:遍历数组的每一项
        //记数器,记录当前遍历的元素位置
        this.i || (this.i = 0)
        //严谨的判断什么时候去执行each核心方法
        //当数组的长度大于0的时候 && 传递的参数必须为函数
        if(this.length > 0 && fn.constructor == Function){
            //循环遍历数组的每一项
            while(this.i < this.length){ //while循环的范围
                //获取数组的每一项
                var e = this[this.i];
                //如果当前元素获取到了,并且当前元素是一个数组
                if(e && e.constructor == Array){
                    //做递归操作
                    e.each(fn);
                } else {
                    //单个元素
                    //使用call或apply方法
                    fn.call(e, e);
                }
                this.i++;
            }
        }
        this.i = null; //释放内存 垃圾回收机制回收变量
    } catch (ex){
        throw ex;
    }
    return this;
};

arr.each(function(item){
    console.info(item);
});

你可能感兴趣的:(使用原型扩展数组的each方法)