ES6生成器和对象解构

3

根据ES6,可以使用从自定义生成器返回的数组解构。但现在我无法想出一种简单对象解构的方法,我认为这应该是可行的(使用Babel和Polyfill):

class Test {
  constructor () { this.props = {a: 1, b: 2}; }

  *[Symbol.iterator]() { yield* this.props; }
}

const {a, b} = new Test();

这应该是可以工作的,对吧?因为它总是简单地返回 a 和 b 的未定义值。


function *gen() { for(i = 0, l = 10; i < l; i = i + 2) { yield i }} const [a, b, c, d, e] = gen(); console.log(a,b,c,d,e); 工作正常。 this.props 没有 Symbol.iterator,因此像您在那里尝试做的那样进行传递不起作用。 - user4639281
2个回答

1

数组解构与可迭代/迭代器对象相关联。对象解构不是这样。如果您想要

const {a, b} = foo

要获取ab的值,那么foo需要实际返回foo.afoo.b的值。因此,您可以将属性存储在实例本身上而不是.props上,或者使用getter。
get a() {
    return this.props.a;
}

1
根据ES6,可以使用从自定义生成器返回的数组解构。
是的。
这应该可以行得通吗?
不 - 这里没有使用数组解构。通过解构到一个对象文字中,迭代器从未被调用,如果它被调用,它会抛出关于this.props对象无法迭代的异常。
但是我无法想出一种使用简单对象解构完成同样任务的方法,就像我认为这样做应该可以(使用Babel和Polyfill):
class Test {
  constructor () {
    this.propA = 1;
    this.propB = 2;
    this.propArr = [];
  }
  *[Symbol.iterator]() {
    yield this.propA; // yield the single value
    yield this.propB; // yield another value
    yield* this.propArr; // yield every from an iterable
  }
}

const [a, b] = new Test();
//    ^    ^ *array* destructuring!

对象解构可在此处使用,例如:
const {propA: a, propB: b} = new Test();

基本上不能使用对象解构与自定义生成器吗? ;( - Alexander Adam
@AlexanderAdam 自定义与否并不重要,对象解构永远不会调用迭代器。你有关于此的实际问题吗?但可以使用Proxy - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接