2017-10-17 123 views
3

根據裝飾器proposal在類getter或setter上裝飾器是否正常?還是隻允許使用正常的方法?例如在類get和setter上使用ES裝飾器

class Foo extends Bar { 

    @override 
    get someProp() { 
    super.someProp + 2; 
    } 
} 

一些庫/框架提供了這樣的裝飾器。但是例如巴貝爾解析器巴比倫認爲這是一個錯誤!

+2

這是完全罰款,對在類體內的任何屬性定義一個裝飾。裝飾者當然需要能夠處理這種描述符。 – Bergi

+0

有沒有什麼不清楚我的答案? –

回答

2

我認爲從decorator的角度來看,它完全適用於setter/getter字段,基本上是任何字段。由於「普通」屬性和setter/getter屬性在屬性描述符類型上不同 - data descriptor vs accessor descriptor和裝飾器應用於屬性描述符,它可以應用於任何屬性,包括「setter/getter」和「method」屬性。

例如,你可以改變二傳手「正常」屬性的裝飾裏面:

function removesetter(klass, prop, descriptor) { 
    return { 
     value: 5, 
     writable: true 
    } 
} 

class Foo { 
    @removesetter 
    get someProp() { 
     return 3; 
    } 
} 

const f = new Foo(); 
console.log(f.someProp); // 5 
+0

謝謝你的回答。如果在類中有裝飾器和裝飾器,那麼會有什麼問題嗎?或者如果描述符的get或set屬性僅在每個裝飾中更新,就足夠了? – user2520818

+0

並且在修飾器函數中可以確定所調用的方法是否是setter或getter? – user2520818

+0

@ user2520818,使用描述符調用裝飾器。它指定了getter和setter。我不認爲有可能確定它被調用的方法。這兩個getter/setter本質上只是一個具有特殊訪問器描述符的屬性,因此無法將相同的裝飾器應用於setter/getter,因爲它沒有意義 –