微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以将属性附加到在 JavaScript 中使用 function*() 创建的生成器吗?

如何解决我可以将属性附加到在 JavaScript 中使用 function*() 创建的生成器吗?

我正在寻找一种方法来为使用 function*() 构造的生成器公开其他属性。我尝试了两种幼稚的方法,但都没有达到我想要的效果

方法 1 说明了我想要做什么,天真地尝试使用 this属性附加到生成器:

function* counter(startValue) {

  // trying to expose a property through "this",// which does not work as intended 
  // (I actually expected this,but it illustrates what I am trying to do)
  this.startValue = startValue;

  // simple counter
  let currentValue = startValue;
  while (true) yield currentValue++;

}

// user code

let myCounter = counter(10);

console.log(myCounter.next().value);
// -> 10

console.log(myCounter.next().value);
// -> 11

// I want myCounter.startValue to expose the start value (10)
// unfortunately this does not work
console.log(myCounter.startValue);
// -> undefined

方法,尝试使用闭包来存储起始值:

// use a closure to store configuration & state
function counter(startValue) {
    let currentValue = startValue;
    let gen = function*() {
        while(true) yield currentValue++;
    }
    // Again,I want the generator to expose the "startValue" parameter
    // This also does not work:
    gen.startValue = startValue;
    return gen;
}

// user code

let myCounter = counter(10)();

myCounter.next().value;
// -> 10

myCounter.next().value;
// -> 11

// Again,no luck accessing the start value
myCounter.startValue;
// -> undefined

我猜因为实际的生成器对象是由 JS 运行时隐式构造的,所以没有办法在不创建某种包装器对象的情况下为其附加其他属性

(由于整个项目结构的原因,构造生成器然后附加属性myCounter.startValue = 10用户代码中的某处)对我来说不是一个选择,它必须在构造函数中完成)

解决方法

您的关闭尝试是正确的方法,您只是错过了在函数内部创建生成器(您想要附加属性的),而不是将其附加到生成器函数:

function* count(currentValue) {
    while(true) yield currentValue++;
}
function counter(startValue) {
    const gen = count(startValue);
    gen.startValue = startValue;
    return gen;
}

let myCounter = counter(10);

myCounter.next().value; // -> 10
myCounter.next().value; // -> 11

myCounter.startValue; // -> 10

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。