You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在JavaScript类中创建Generator函数时出现Unexpected token function*错误怎么办?

类内部定义Generator的解决方案

当然可以在类内部创建Generator,你遇到的错误是因为类方法的定义语法错误——类内部定义方法时不需要加function关键字,生成器方法只需要在方法名前添加*即可。

正确的类生成器实例方法写法

这是最推荐的方式,生成器方法挂载在类的原型上,所有实例共享,既保持封装性又节省内存:

class MyClass{
  constructor() {
    this.foo = 4;
    this.bar = 5;
  }

  // 去掉function关键字,直接用*前缀定义生成器方法
  * myGenerator() {
    let index = this.foo;
    while(index < this.bar) {
      yield index++;
    }
  }
}

使用方式

实例化类后,调用生成器方法得到Generator对象,再通过遍历或next()方法获取值:

const obj = new MyClass();
const gen = obj.myGenerator();

// 方式1:for...of遍历
for (const num of gen) {
  console.log(num); // 输出4
}

// 方式2:手动调用next()
const gen2 = obj.myGenerator();
console.log(gen2.next()); // { value: 4, done: false }
console.log(gen2.next()); // { value: undefined, done: true }

其他可选方案

方案1:在构造函数内定义生成器属性

如果需要每个实例拥有独立的生成器函数副本(比如需要绑定特定上下文),可以在构造函数内直接定义:

class MyClass{
  constructor() {
    this.foo = 4;
    this.bar = 5;
    
    // 直接定义为实例属性,保留function*语法
    this.myGenerator = function*() {
      let index = this.foo;
      while(index < this.bar) {
        yield index++;
      }
    };
  }
}

方案2:静态生成器方法(适用于静态属性场景)

如果你的foo和bar是类的静态属性,也可以定义静态生成器方法:

class MyClass{
  static foo = 4;
  static bar = 5;

  static * myGenerator() {
    let index = MyClass.foo;
    while(index < MyClass.bar) {
      yield index++;
    }
  }
}

// 调用方式:直接通过类调用
const gen = MyClass.myGenerator();
console.log(gen.next().value); // 4

错误原因回顾

你之前的代码报错是因为类内部的方法定义不允许使用function关键字,不管是普通方法还是生成器方法,都要遵循类方法的简写语法——生成器方法只需要* 方法名()的形式即可。

内容的提问来源于stack exchange,提问作者user23234689

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:08:19