对象字面量配合Generator函数的单行声明核心是方法简写、星号紧贴方法名、计算属性灵活介入;正确写法为{ values(){yield 1;yield 2;} },调用直接obj.values().next(),支持解构传参如const counter={range(){let i=config.start;for(let n=0;n<config.count;n++){yield i;i+=config.step;}}}。

对象字面量配合 Generator 函数的单行声明,核心在于三点:方法简写语法、*generatorMethod() 的星号位置规范、以及属性名表达式或计算属性的灵活介入。它不追求“一行写完全部逻辑”,而是让 Generator 作为对象的一个自然方法被简洁定义和调用。
Generator 方法在对象中直接简写
ES6 允许省略 function 关键字,并把星号 * 紧贴在方法名前(不是函数名前或冒号前):
-
正确写法:
{ *values() { yield 1; yield 2; } } -
错误写法:
{ values: function*() { ... } }(虽可运行,但失去简写意义)或{ * values() { ... } }(语法错误)
这样定义后,调用只需 obj.values().next(),无需额外变量或函数声明,天然契合单行载荷场景。
结合变量解构与属性简写传递初始参数
若 Generator 需要外部数据驱动,可用对象字面量的属性简写 + 解构,实现“声明即传参”:
const config = { start: 0, step: 2, count: 3 };
const counter = {
*range() {
let i = config.start;
for (let n = 0; n < config.count; n++) {
yield i;
i += config.step;
}
}
};
// 单行启动:[...counter.range()] → [0, 2, 4]
更进一步,可将 config 直接内联为计算属性(见下一点),避免中间变量。
用属性名表达式动态挂载 Generator 方法
当方法名需由变量决定时,用方括号 [] 包裹表达式,仍保持单行结构:
const name = 'items'; const api = { *[name]() { yield 'a'; yield 'b'; } };- 此时
api.items().next()可用,等价于手动写items() { ... }
这种写法适合插件式扩展、测试桩命名、或根据环境切换 Generator 行为,声明与绑定一步到位。
搭配展开运算符快速消费 Generator 输出
对象字面量定义的 Generator 方法,常与 [...] 或 Array.from() 组合,形成真正意义上的单行载荷闭环:
const data = { *seq() { yield 'x'; yield 'y'; } }; const list = [...data.seq()]; // ['x', 'y']- 也可用于
for...of、Array.prototype.map等原生迭代接口,无需手动调用.next()
这使 Generator 不再是“需要管理状态的异步构造”,而退化为一种轻量、可组合的数据源声明方式。

















