总是看到 hax 大佬吐槽 tc39,可是具体在说什么一直不清楚
从原型到 class
1.写法对比
1 | // ES6 |
2.区别
1.class 声明会“提升”,但不会初始化赋值。Foo 进入暂时性死区,类似于 let、const 声明变量(提升的说法有争议)
1 | const bar = new Bar(); // it's ok |
2.class 声明内部会启用严格模式
1 | // 引用一个未声明的变量 |
3.class 的所有方法(包括静态方法和实例方法)都是不可枚举的
1 | // 引用一个未声明的变量 |
4.class 的所有方法(包括静态方法和实例方法)都没有原型对象 prototype,所以也没有[[construct]],不能使用 new 来调用
1 | function Bar() { |
5.必须使用 new 调用 class
1 | function Bar() { |
6.class 内部无法重写类名
1 | function Bar() { |
继承
3.写法对比
1 | // ES6 |
1 | // class |
4.区别
1.ES6 子类可以直接通过 __proto__ 寻址到父类, 而通过 ES5 的方式,Sub.__proto__ === Function.prototype
2.ES5 和 ES6 子类 this 生成顺序不同。ES5 的继承先生成了子类实例,再调用父类的构造函数修饰子类实例,ES6 的继承先生成父类实例,再调用子类的构造函数(constructor中必须先调用super方法)修饰父类实例。这个差别使得 ES6 可以继承内置对象
1 | function MyES5Array() { |
class field 提案
- declarations
- static
- private #
- private fields
- private method
Babel - babel 叫 class properties ?