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

使用 ES6 语法定义类方法属性

使用 ES6 语法定义类方法属性

喵喵时光机 2023-04-27 16:38:21
在 ES5 语法中,类Foo的方法bar具有属性,flag可以这样定义:function Foo() {};Foo.prototype.bar = function() { console.log('bar invoked'); };Foo.prototype.bar.flag = true;我可以混合使用 ES5 和 ES6 语法并执行以下操作:class Foo {  bar() {    console.log('bar invoked');  };};Foo.prototype.bar.flag = true;或者只使用 ES6 语法:class Foo {  bar() {    this.bar.flag = true;    console.log('bar invoked');  };};如果我必须选择,我会选择第二个选项,但我不喜欢在其定义中包含方法名称的冗余。有没有更好的办法?
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

如果你能超越 ES2015 并且不要害怕使用实验性的东西,你可以玩装饰器。通天塔


class Foo {

  @flag

  bar() {

    console.log('bar invoked');

  };

};


function flag(target) {

  target.descriptor.value.flag = true;

  return target;

}



const foo = new Foo()


console.log(foo.bar.flag)


查看完整回答
反对 回复 2023-04-27
?
RISEBY

TA贡献1856条经验 获得超5个赞

在 JavaScript 中,没有声明性的方法来为方法创建属性(这是很少见的事情),所以如果你想这样做,你必须像第二个例子那样在事后做。(或者你的第三个,但每次都重复bar调用,所以它有点误导和/或可能没那么有用。)



查看完整回答
反对 回复 2023-04-27
?
当年话下

TA贡献1890条经验 获得超9个赞

无法引用使用严格模式调用的函数(请记住,使用类会使严格模式自动生效)。


如果您想这样做,请使用 ES5“类”:


function Foo() {};

Foo.prototype.bar = function() {

  console.log('bar invoked');

  arguments.callee.flag = true;

};

请记住,它arguments.callee在严格模式下被禁用。


查看完整回答
反对 回复 2023-04-27
  • 3 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信