stage-x 处于某个阶段,描述的是ECMA标准相关的内容。根据天提案划分界限,stage-x大致分为以下阶段:
-
stage-0:还是一个设想,只能由TC39成员或TC39贡献者提出,什么样的设想呢?比如怎么一年后我称为世界首富,我应该怎么做才能称为世界首富呢?
-
stage-1::提案阶段,比较正式的提议,只能由TC39成员发起,这个提案要解决的问题必须有正式的书面描述。比如,我设想称为世界首富,建议认 “比尔.盖茨” 和 “亚马逊CEO” 两个为亲爹。并且继承它们两个的遗产,我就可以成为世界首富了。
-
stage-2:草案,有了初始规范,必须对功能语法和语义进行正式描述,包括一些实验性的实现。继续首富之梦,认爹也不能白认吧,起码有点诚意给每一个爹磕三个响头就稳了。可以提前计划一下首富后的快乐生活。
-
stage-3:候选,该提议基本已经实现,需要等待实验验证,用户反馈及验收测试通过。 基本上已经稳了,就等着继承遗产就ok了。
-
stage-4:已完成,必须通过
Test262
验收测试,下一步就纳入ECMA标准。 首富开始交接仪式,成功上位,等待下次福布斯排行榜统计后,你就上榜了!
如果想要提前使用一些较为新鲜的ECMA语法(未到stage-4)阶段的语法,如ES6类的扩展:
- 实例属性初始化
- 静态类属性
- 函数绑定到类实例
- 类上定义静态函数
class Bork {
//Property initializer syntax
instanceProperty = "bork";
boundFunction = () => {
return this.instanceProperty;
};
//Static class properties
static staticProperty = "babelIsCool";
static staticFunction = function() {
return Bork.staticProperty;
};
}
let myBork = new Bork;
//Property initializers are not on the prototype.
console.log(myBork.__proto__.boundFunction); // > undefined
//Bound functions are bound to the class instance.
console.log(myBork.boundFunction.call(undefined)); // > "bork"
//Static function exists on the class.
console.log(Bork.staticFunction()); // > "babelIsCool"
可以借助 babel 的一些插件在构建编译阶段转换成浏览器可运行的代码。插件是 @babel/plugin-proposal-class-properties
。这样配置:
{
"plugins": ["@babel/plugin-proposal-class-properties"]
}
这在开发React场景下使用偏多,也可以使用React脚手架工具这样这些语法都包括在内。