ES6的class对老的“原型继承”写法带来了改良。
相比“原型继承”,class的特点有:
1.给“类”(其实是函数)添加方法不需要通过函数.prototype,方法直接写在花括号内就行。
2.使用extends关键字,不需要再写子类.prototype = Object.create(父类.prototype)
3.子类方法调用父类同名方法(通常是在多态的时候)可以使用super关键字,不用指明父类名称了。
4.用class声明“类”,花括号内只能声明公用的方法,不能定义属性。因为本质上,js的“类”和“对象”之间不是在复制模板,而是在引用,如果js的“类”定义了属性,就会变成一个公用的属性,可能埋下隐患。
5.用extends可以扩展js内置的对象类型,比如Array或RegExp,原来的原型继承方法想实现这个就很难,除非知道源码是怎么写的。
class的不足:
1.js的“类”和“对象”之间不是在复制模板,而是在引用,所以如果不小心改动了“父类”的方法,“子类”及其所有实例都会受影响,毕竟它们是用引用关联起来的,不是真的拷贝了父类的行为。
2.class语法不能定义属性,成员之间也不能有公有属性。硬要有也可以有,类.prototype.某某属性。这样,实例.某某属性确实可以访问到这个共享属性。但是!实例.某某属性++,又会在实例自身上添加属性,而不是如我们所想的那样给公有属性++,所以就很狗。
3.还有个容易出人意料的是,class的父类子类绑定是静态的,子类extends父类,之后子类方法里的super就总是引父类的方法,就算给子类方法改了this,super指向的仍然是原来的父类方法,而不会指向新的this的父类。
除非把那个方法,手动指明“谁是你所属的类”,才能改掉原来的super,方法内的super才会指向新的。
tips:用bind方法得到的硬绑定函数,不会像普通函数一样被ES6的extends扩展到子类中。
小结:本书作者讨厌class