账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    es6 生成器函数里面 yield *this.items.keys(); 中的 *this 什么作用
    57
    0

    深入理解es6 p146,看到一串代码:
    代码前的引言:

    既然生成器方法很有用,那么在表示集合的自定义类中定义一个默认迭代器,那就更好。你可以使用 Symbol.iterator 来定义生成器方法,从而定义出类的默认迭代器,就像这样:
    class Collection {
        constructor() {
                this.items = [];
            }
            *[Symbol.iterator]() {
                yield *this.items.keys();
            }
    }
    var collection = new Collection();
    collection.items.push(1);
    collection.items.push(3);
    collection.items.push(2);
    
    for (let x of collection) {
        console.log(x);
    }
    
    

    全书 *this 用法只此一处,这个地方我不明白,这是什么用法?我测试了下, *this 的代码可以这样替换:

    class Collection {
        constructor() {
                this.items = [];
            }
            *[Symbol.iterator]() {
                for (let item of this.items.keys()) {
                    yield item;
                }
            }
    }
    var collection = new Collection();
    collection.items.push(1);
    collection.items.push(3);
    collection.items.push(2);
    
    for (let x of collection) {
        console.log(x);
    }
    
    

    如果* this 代码不改,换一种实现方式也可以

    class Collection {
        constructor() {
                this.items = [];
            }
            *[Symbol.iterator]() {
                yield *this.items.keys();
            }
    }
    var collection = new Collection();
    collection.items.push(1);
    collection.items.push(3);
    collection.items.push(2);
    
    /*for (let x of collection) {
        console.log(x);
    }*/
    
    for (let x of collection.items.keys()) {
        console.log(x);
    }
    

    但是我始终不能理解这个用法是为什么,因为我觉得没有 * 也是可以的,但是实际上测试没有 * 就不对了,于是我就猜测,难道这里是这么个意思?把 this.items.keys 当成生成器函数?但是觉得不合理

    class Collection {
        constructor() {
                this.items = [];
            }
            *[Symbol.iterator]() {
                yield *(this.items.keys)();
            }
    }
    var collection = new Collection();
    collection.items.push(1);
    collection.items.push(3);
    collection.items.push(2);
    
    for (let x of collection) {
        console.log(x);
    }

    所以有人知道这里的 *this 到底是什么逻辑么?
    书上这么解释的

    此例为生成器方法使用了一个需计算名称,并将此方法委托到 this.items 数组的 keys()
    迭代器上。任意管理集合的类都包含一个默认迭代器,这是因为一些集合专用的操作都要求
    目标集合具有迭代器。现在, Collection 的任意实例都可以在 for-of 循环内被直接使
    用,也能配合扩展运算符使用。
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 恋无可恋 普通会员 1楼
      { "error": "Failed to generate content." }
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部