用 ES6 语法定义 class 方法 属性

Define class method property with ES6 syntax

在 ES5 语法中,具有方法 bar 的 class Foo 具有 属性 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');
  };
};

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

在 JavaScript 中的方法上没有创建 属性 的声明方式(这是很少见的事情),所以如果你想为此,您必须像第二个示例中那样 after-the-fact 。 (或者你的第三个,但每次调用 bar 时都会重复,所以它有点误导 and/or 可能没那么有用。)

如果你能超越 ES2015 并且不怕使用实验性的东西,你可以玩装饰器。 Babel repl.

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)

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

如果你想这样做,使用 ES5 "类":

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

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