2017-05-15 48 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