在 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)
RISEBY
TA贡献1856条经验 获得超5个赞
在 JavaScript 中,没有声明性的方法来为方法创建属性(这是很少见的事情),所以如果你想这样做,你必须像第二个例子那样在事后做。(或者你的第三个,但每次都重复bar
调用,所以它有点误导和/或可能没那么有用。)
当年话下
TA贡献1890条经验 获得超9个赞
无法引用使用严格模式调用的函数(请记住,使用类会使严格模式自动生效)。
如果您想这样做,请使用 ES5“类”:
function Foo() {};
Foo.prototype.bar = function() {
console.log('bar invoked');
arguments.callee.flag = true;
};
请记住,它arguments.callee在严格模式下被禁用。
添加回答
举报
0/150
提交
取消