使用分号声明类属性时的奇怪行为

时间:2018-02-17 12:43:25

标签: javascript es6-class ecmascript-next

class SomeClass {
  x: 5;
  y = 10;
}

const c = new SomeClass();
alert(c.x + ' : ' + c.y); 

Edit mqkw2zk94j

为什么代码可编译但c.x的值未定义?

使用:声明类属性有什么影响?

2 个答案:

答案 0 :(得分:2)

关于/verifyEmail部分,尽管这是一个有效的javascript代码,但它没有多大用处。
这是一个javascript label,它主要在循环上下文中使用(如果有的话)。

所以回答你的问题:

  

为什么代码可编辑

因为从技术上讲这是一个有效的JavaScript代码(但不是有效的x: 5字段)。

  

class的值未定义

因为c.x是标签而不是类字段。

  

使用x

声明类属性有什么影响

你得到一个标签而不是一个类字段。

<小时/> 的附录
另一个常见的错误是这段代码:

:

您会认为class SomeClass { z = () => { x: 5; }; } 将返回带有z()键的对象:

x

但实际上你有一个标签为`{x:5}` 的函数只运行x的表达式。

为了完整起见,修复将是添加一个显式返回和另一组花括号

5

或者用括号包装整个事物

() => {return {x: 5}}

修改
作为以下评论的后续内容:
为了清楚起见,您的代码编译在我测试的几个环境以及堆栈片段中,如下所示:

&#13;
&#13;
() => ({x: 5})
&#13;
&#13;
&#13;

答案 1 :(得分:0)

代码无效ES6。

您似乎正在使用babel进行“编译”,并且无意中启用了flow语法扩展(以及第二行的class properties)。在流程中,daemonGetNodeStatus('http://kube.com/something', 'name', function(err, result){ if(err) {console.log(err); } else { console.log(result); // do whatever you want with the async result } }); class field type annotation。当然,x: 5作为一种类型没有意义,但显然它们允许非常随意的表达。