繁体   English   中英

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

[英]Define class method property with ES6 syntax

在 ES5 语法中,一个类Foo带有一个带有属性flag的方法bar ,可以像这样定义:

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');
  };
};

如果我必须选择,我会选择第二个选项,但我不喜欢在其定义中包含方法名称的冗余。 有没有更好的办法?

如果你可以超越 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)

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

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

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

function Foo() {};
Foo.prototype.bar = function() {
  console.log('bar invoked');
  arguments.callee.flag = true;
};

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM