喵喵時光機
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)

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
提交
取消