一尘不染

为什么不悬挂ES6类?

javascript

由于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类?


阅读 256

收藏
2020-05-01

共1个答案

一尘不染

为什么不悬挂ES6类?

其实他们 _都_悬挂(变量绑定在整个范围内都有效),就像letconst是他们只未初始化。

提升其定义很有意义

不。在定义类之前使用类绝不是一个好主意。考虑例子

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类,则现在会引发错误。

2020-05-01