JavaScript设计模式之迭代器模式

迭代器模式

定义

  迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。

JQuery中的迭代器

  迭代器模式无非就是循环访问聚合对象中的各个元素。比如 jQuery 中的 $.each 函数,其中回调函数中的 index 为当前索引, value 为当前元素,代码如下:

$.each([1, 2, 3], function(index, value) {
	console.log("当前下标为:" + index);
	console.log("当前值为:" + value);
});

实现自己的迭代器

var Iterator = function(obj) {
	var current = 0;
	
	var next = function () {
		var element;
        if (!this.hasNext()) {
            return null;
        }
        element = obj[current];
        current += 1;
        return element;
	}
	
	var hasNext = function() {
		return current < obj.length;
	}
	
	var getCurrentItem = function () {
		return obj[current];
	}
	
	return {
		next: next,
		hasNext: hasNext,
		getCurrentItem: getCurrentItem,
		length: obj.length,
	}
}

var it = Iterator([1, 2, 3, 4, 5]);
while (it.hasNext()) {
    console.log(it.next());  // 1, 2, 3, 4, 5
}

迭代类数组对象和字面量对象

  迭代器模式不仅可以迭代数组,还可以迭代一些类数组的对象,例如 {“0” : “a”, “1” : “b”}。只要迭代的聚合对象拥有 length 属性而且可以用下标访问,那它就可以被迭代。
  在 JavaScript 中, for in 语句可以用来迭代普通字面量对象的属性。jQuery 中提供了 $.each 函数来封装各种迭代行为:

$.each = function(obj, callback) {
	var value,
		i = 0,
		length = obj.length,
		isArray = isArraylike(obj);
	
	if(isArray) {
		for(; i < length; i++) {
			value = callback.call(obj[i], i, obj[i]);
			if(value === false) {
				break;
			}
		}
	} else {
		for(i in obj) {
			value = callback.call(obj[i], i, obj[i]);
			if(value === false) {
				break;
			}
		}
	}
	return obj;
}

中止迭代器

  迭代器可以像普通 for 循环中的 break 一样,提供一种跳出循环的方法,即在传递的 callback 函数里返回 false, 则提前中止循环:

$.each([1, 2, 3], function(index, value) {
	if(value > 2) {
		return false;
	}
	console.log("当前下标为:" + index);
	console.log("当前值为:" + value);
})

返回 true 则相当于 continue,则会跳过本次执行,继续后面的执行。

总结

  迭代器模式是一种相对简单的模式,简单到很多时候我们都不认为它是一种设计模式。目前的绝大部分语言都内置了迭代器。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值