你不知道的js(上卷) 附录 class

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容