猿问

以符号命名的方法不返回可迭代

我似乎无法使以符号命名的方法可以调用。


class Mar {

  sym = Symbol("sym");


  *[this.sym]() {

    yield 1;

    yield 2;

    yield 3;

  }

}


const a = new Mar();

console.log([...a[a.sym]()]);

似乎在Mar#[MarInstance.sym]任何地方都没有定义。我错过了什么?


杨魅力
浏览 154回答 2
2回答

缥缈止盈

这会将属性定位在使用该类创建的对象的原型上,这可能是您想要做的:const s = Symbol('my symbol')class MyClass {  *[s]() {    yield 1    yield 2    yield 3  }}const gops = Object.getOwnPropertySymbolsconst o = new MyClass()console.log(gops(o)) // []console.log(gops(o.__proto__).map(({description: d}) => d)) // ['my symbol']以下类字段语法将属性s直接放在类创建的对象上:class MyClass {  s = Symbol('my symbol')}const o = new MyClass()console.log(o.hasOwnProperty('s')) // true

慕尼黑的夜晚无繁华

如果应该共享,您必须在构造函数(每个实例)中显式创建方法,或者在原型上显式创建方法:class Mar {  sym = Symbol("sym");  constructor() {    this[this.sym] = function*() {      yield 1;      yield 2;      yield 3;    };  }}要将其放在原型上,您必须sym根据您的意图创建一个类属性或类似的东西。编辑——如果您希望类的所有实例共享一个符号,那么您可以为符号使用静态类属性。语法仍然有点笨拙,但你可以做的是将类实例化包装在一个函数中:const Mar = function() {  const sym = Symbol("sym");  class Mar {    *[sym]() {      yield 1; yield 2; yield 3;    }  }  Mar.sym = sym;  return Mar;}();let m = new Mar();console.log([...m[Mar.sym]()]);通过将 Symbol 实例作为访问方法的一种方式,您试图实现的目标并不完全清楚,但这些是实现它的方法。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答