2017-05-15 81 views
7

是否有任何JavaScript語法,讓我做下面的更簡潔:吸氣箭頭函數的語法

class MyClass { 
    static get myProp() { 
     return 1; 
    } 
} 

不是一個大問題,但我想知道是否有東西,就像一個箭頭功能,讓我做它只是一個小更精簡,是這樣的:

class MyClass { 
    static get myProp =() => 1; 
} 

我知道我可以寫這樣的(雖然不是一個安全的等價物):

class MyClass {} 
MyClass.myProp = 1; 

或者這更難閱讀和更長的替代:

class MyClass {} 
Object.define(MyClass, 'myProp', { get:() => 1; }); 

但感覺像class語法

+0

另請參見http://stackoverflow.com/questions/31362292/how-to-use-es6-arrow-in-class-methods - 它似乎'箭頭方法'是(仍然?)一個實驗ES7功能 –

+1

大多數時候,人們做靜態get myProp(){...'他們並不需要只讀屬性。這只是提升構造函數上方'MyClass.myProp = 1'的慣用方式(例如對於AngularJS $註釋有用)。除了你列出的那些,別無選擇。 'static get myProp =()=> 1'顯然不被支持,因爲沒有理由讓它被分配給除函數外的任何東西。 – estus

+2

你是什麼意思「*雖然不是一個安全的等價物*」? – Bergi

回答

2

有一個更好的方式來做到這一點的濫用。它可以使用Babel Preset進行類轉換。 獲取此特定功能的預設爲'preset-stage-2'。

通天文檔頁面預設階段2: https://babeljs.io/docs/plugins/preset-stage-2/

使用案例: 在你.bablerc文件廣告本。

{ 
    "presets": ["stage-2"] 
} 

:它是一個單獨的NPM模塊,以便預先安裝它。

+0

這是正確的方法。這是我後來問起的一個問題,我們實際上已經使用了幾個月,儘管我們只是使用'transform-class-properties'作爲插件而沒有預設,也是同樣的事情。 – samanime

0

您不能使用箭頭函數來定義類聲明中的類函數。試圖這樣做會產生語法錯誤。

下面的代碼:

class MyClass { 
 
    static get myVal() { 
 
    console.log(this); 
 
    return 1; 
 
    } 
 

 
    static get yourVal =() => { 
 
    console.log(this); 
 
    return 2; 
 
    } 
 
}

產生以下錯誤:

{ 
    "message": "Uncaught SyntaxError: Unexpected token =", 
    "filename": "https://stacksnippets.net/js", 
    "lineno": 19, 
    "colno": 22 
} 

而這種代碼:

class MyClass { 
 
    dogs = (val) => { 
 
    console.log('Bark, bark', val); 
 
    } 
 
}

產生這個錯誤:

{ 
    "message": "Uncaught SyntaxError: Unexpected token =", 
    "filename": "https://stacksnippets.net/js", 
    "lineno": 14, 
    "colno": 12 
} 

此代碼:

class MyClass {} 
Object.define(MyClass, 'myProp', { get:() => 1; }); 

只是ES5版本驗證碼:

class MyClass { 
    static get myProp() { return 1; } 
} 

此代碼:

class MyClass {} 
MyClass.myProp = 1; 

是否將myProp附加到類的原型,並且等效於靜態變量。但是這個價值可以改變。所以,如果你想有一個只讀屬性,那麼你需要以上制定者之一..

在此代碼:

class MyClass { 
 
    static get myVal() { 
 
    return 1; 
 
    } 
 
} 
 
MyClass.yourVal = 33; 
 

 
console.log(MyClass.myVal); 
 
console.log(MyClass.yourVal);

我們得到的133輸出。這是什麼預計

+0

其中一種較新的語法允許在類中使用箭頭函數,您只需使用babel變換就可以了。 – samanime

+0

你說在你的問題中使用Babel什麼也沒說。我說的是ES6的規則。如果巴別爾違反了這些規則,那麼它聽起來像巴別塔已經壞了。如果我的回答符合真正的ES6規則 – Intervalia

+0

雖然它尚未被接受,但它是一個正式提案,有望被接受(第3階段4):https:// github .COM/TC39 /提案級字段。我沒有明確指定ES級別,我只是要求提供語法。 – samanime