6

我目前正在實施static land規範(幻想土地的替代方案)。我不僅要使用普通對象作爲類型,還要使用靜態方法使用ES2015類。我已經將這些靜態方法實現爲咖喱形式的箭頭函數,而不是常規函數。但是,這是不可能的ES2015類:具有靜態箭頭功能的類

class List extends Array { 
    static map = f => xs => xs.map(x => f(x)) 
    static of = x => [x] 
} 

map並不需要自己this,因爲它僅僅是對List構造一個咖喱功能。爲了使其工作,我必須寫static map(f) { return xs => xs.map(x => f(x)) },這是非常煩人的。

  • 爲什麼我不能在ES2015類中使用箭頭函數和賦值表達式?
  • 無論如何,有沒有簡明的方法來實現我的目標?
+1

如果一切都是靜態的,爲什麼'擴展數組'? –

+0

https://stackoverflow.com/questions/32545495/es6-class-instance-properties可能的重複? – Bergi

+0

@ T.J。這個想法是使現有的圖書館靜態土地兼容。所以會有非靜態屬性的類,它們必須被擴展。 – ftor

回答

10

爲什麼我不能在ES2015類中使用箭頭函數和賦值表達式?

因爲那是ES2015類語法是不如何設計  — 現在,請參閱下面的線下。

是否有簡明的方法來實現我的目標呢?

目前還不清楚,我認爲你想要類可言,只是一個對象:(。你說,延長對你在做什麼重要的)

const List = { 
    map: f => xs => xs.map(x => f(x)), 
    of: x => [x] 
}; 

但是如果你想List擴展Array(例如,你將有實例),但是這些靜態添加到它,你需要兩個步驟:

class List extends Array { 
} 
Object.assign(List, { 
    map: f => xs => xs.map(x => f(x)), 
    of: x => [x] 
}); 

如果你希望他們不可枚舉的或不可配置,等等,你會想Object.defineProperties而非Object.assign;我會離開,作爲一個練習留給讀者......


有A類stage 2 proposal「領域」,包括靜態字段。如果進展到階段4,最終它將成爲即將到來的語言規範的一部分(可能ES2018;在這一點上不太可能使ES2017,但你永遠不知道)。

這將允許類中聲明的靜態域,幾乎是完全相同的方式,你向他們展示:

// NOT IN THE LANGUAGE YET, BUT A PROPOSAL AT STAGE 2 
class List extends Array { 
    static map = f => xs => xs.map(x => f(x)); 
    static of = x => [x]; 
} 

如果你有通天transpile,你可以告訴它包括第2點階段的建議。

+1

感謝您的鏈接和快速回復。 – ftor