用 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
在严格模式下被禁用。
在 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
在严格模式下被禁用。