前端练习36 翻箱倒柜

知识点

  1. Iterator接口
  2. Generatorr函数

题目

完成一个类Box,实例化的时候给它传入一个数组。Box的实例支持for...of操作,可以把初始化的时候传给Box的数组内容遍历出来:

const box = new Box(['book', 'money', 'toy'])
for (let stuff of box) {
  console.log(stuff) // => 依次打印 'book', 'money', 'toy'
}

不能在constructor里面直接返回数组。

实现

使用Generator函数

要求能使用for...of进行遍历,也就是说需要为Box的实例对象添加一个遍历器接口,也就是Iterator接口,部署了这个接口后,就可以完成遍历操作

数据的Iterator接口部署在数据接口的Symbol.iterator属性上,Symbol.iterator的值就是一个Symbol值Symbol(Symbol.iterator)

所以我们要在实例的Symbol.iterator属性上定义一个函数,它应该是一个Iterator对象,我们这里定义的函数是一个Generator函数,它的返回值就是一个Iterator对象,它默认提供了next方法供便利时调用

所以:

class Box {
  constructor(arr) {
    this[Symbol.iterator] = function* () {
      for (let i = 0; i < arr.length; i++) {
        yield arr[i]
      }
    }
  }
}

不使用Generator函数

我们之所以能够使用上面的Generator函数,就是因为它的返回结果是一个Iterator对象,这个Iterator对象有next方法,每次遍历时都要调用这个方法,返回的记结果就是包含了valuedone两个属性的值

所以,我们不使用Generator函数,自己都构造返回一个具有next方法的对象也是可以的,next方法返回对象也需要包括了valuedone连个属性,value属性是for...of的返回值,done用来标识遍历何时结束。

class Box {
  constructor(arr) {
    this[Symbol.iterator] = function* () {
      let index = 0;
      return {
          next() {
            return { value: arr[index], done: index === arr.length }
          }
      }
    }
  }
}

参考

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值