ES2015 迭代器模式 Iterator

迭代器模式旨在提供一种统一的遍历接口,降低代码耦合度。通过实现迭代器,调用者无需关注数据结构的变化。ES2015中的迭代器是语言级别的实现,适用于所有实现了iterable接口的数据结构,允许使用for...of进行遍历。
摘要由CSDN通过智能技术生成

设计模式:迭代器模式

实现迭代器的目的是干什么呢?


// 迭代器设计模式

// 场景:你和我协同开发一个任务清单应用

// 我的代码   =========

const todoList = {
    life:['吃饭','睡觉','撸猫'],
    study:['语文','数学','英语']
}

// 你的代码   =========

for (const item of todoList.life) {
	console.log(item);
}
for (const item of todoList.study) {
	console.log(item);
}

如果我需要在我的todoList 数据列表里添加数据时,你的代码就需要作出相应的更改,对于调用来说,代码耦合度太高

如下:


// 迭代器设计模式

// 场景:你和我协同开发一个任务清单应用

// 我的代码   =========

const todoList = {
    life:['吃饭','睡觉','撸猫'],
    study:['语文','数学','英语'],
    game:['王者荣耀']
}

// 你的代码   =========

for (const item of todoList.life) {
	console.log(item);
}
for (const item of todoList.study) {
	console.log(item);
}
for (const item of todoList.game) {
	console.log(item);
}

如何解决:

如果我的代码能够对外统一提供一个遍历的接口

对于调用者而已,就不用去关心它内部的数据结构,也不用担心结构的改变

我们可以自己写一个方法来实现:


// 迭代器设计模式

// 场景:你和我协同开发一个任务清单应用

// 我的代码   =========

const todoList = {
    life:['吃饭','睡觉','撸猫'],
    study:['语文','数学','英语'],
    game:['王者荣耀'],
    each:function(callback){
        const all = [].concat(this.life,this.study,this.game)
        for(const item of all){
            callback(item)
        }
    }
}

// 你的代码   =========

//  不需要关注数据,只管调用
todoList.each(function(item)){
    console.log(item)
}

其实实现可迭代接口也是相同的道理

用迭代器的方法实现:


// 迭代器设计模式

// 场景:你和我协同开发一个任务清单应用

// 我的代码   =========

const todoList = {
    life:['吃饭','睡觉','撸猫'],
    study:['语文','数学','英语'],
    game:['王者荣耀'],

    [Symbol.iterator]:function () {
        const all = [].concat(this.life,this.study,this.game)
        let index = 0;
        return {
            next:function () {
                return {
                    value :all[index],
                    done:index++ > all.length
                }
            }
        }
    }
    
}

迭代器的核心 就是对外提供统一遍历接口,让外部不用去担心内部的数据结构是怎么样的

这里展示的each方法只适用于这里展示的数组结构

而ES2015种的迭代器 是从语言层面去实现的迭代器模式,所以说它适用于任何数据结构,只要实现了iterable 接口,那我们就可以实现使用for…of 遍历对象

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值