为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨魅力 2022-05-26 17:07:24
我似乎无法使以符号命名的方法可以调用。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]任何地方都没有定义。我错过了什么?
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

这会将属性定位在使用该类创建的对象的原型上,这可能是您想要做的:


const s = Symbol('my symbol')

class MyClass {

  *[s]() {

    yield 1

    yield 2

    yield 3

  }

}


const gops = Object.getOwnPropertySymbols

const 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


查看完整回答
反对 回复 2022-05-26
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

如果应该共享,您必须在构造函数(每个实例)中显式创建方法,或者在原型上显式创建方法:


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 实例作为访问方法的一种方式,您试图实现的目标并不完全清楚,但这些是实现它的方法。


查看完整回答
反对 回复 2022-05-26
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号