由于ES6类仅仅是 avaScript现有的基于原型的继承 的 _语法[[1]],因此(IMO)可以合理地定义它:
var foo = new Foo(1, 2); //this works function Foo(x, y) { this.x = x; this.y = y; }
但是以下操作无效:
var foo = new Foo(1, 2); //ReferenceError class Foo { constructor(x, y) { this.x = x; this.y = y; } }
为什么不悬挂ES6类?
其实他们 _都_悬挂(变量绑定在整个范围内都有效),就像let和const是他们只未初始化。
let
const
提升其定义很有意义
不。在定义类之前使用类绝不是一个好主意。考虑例子
var foo = new Bar(); // this appears to work console.log(foo.x) // but doesn't function Bar(x) { this.x = x || Bar.defaultX; } Bar.defaultX = 0;
比较一下
var foo = new Bar(); // ReferenceError console.log(foo.x); class Bar { constructor (x = Bar.defaultX) { this.x = x; } } Bar.defaultX = 0;
如您所料,这会引发错误。这是静态属性,原型混合,装饰器和其他所有问题。对于子类来说,这也是非常重要的,当您将类与未经调整的原型一起使用时,子类在ES5中完全中断,但是如果extend尚未初始化ed类,则现在会引发错误。
extend