一、class类继承
    (1)class继承还是基于原型的。
    (2)es5和es6继承机制区别:
    es5是先创建子类实例,再盗用构造函数,将父类实例属性和方法添加到子类实例上。
    es6是先调用super方法,通过父类constructor方法将父类实例属性和方法添加到this对象上,再通过子类构造函数修改this指向。
    (3)super关键字,相当于父类构造函数,作用是将父类实例方法与属性添加到this对象上,但是返回子类实例,即super内部this指向子类实例对象。

    1. class A {
    2. constructor(name){
    3. this.name = name
    4. }
    5. sayHi(){
    6. console.log(`i'm${this.name},an instance of Class A`)
    7. }
    8. }
    9. class B extends A {
    10. constructor(name,identity){
    11. super(name)
    12. this.identity = identity
    13. }
    14. greet(){
    15. console.log(`i'm ${this.identity}`)
    16. }
    17. }

    二、instanceof
    用于检测构造函数的prototype属性是否在某个函数的原型链上。
    后面的参数一定是构造函数。Object.prototype在所有引用值的原型链上

    1. [] instanceof Array // true
    2. [] instanceof Object // true
    3. Array instanceof Object // true
    1. **怎么判断数组? obj instanceof Array**

    、手写简易JQuery考虑插件与拓展性
    思路: 构造函数接受一个选择器,将don节点赋值到自己身上,添加length属性(类数组),有获取元素的方法,遍历的方法,还有添加事件监听方法。
    插件:在class的原型对象上添加方法。
    拓展性: 写一个新的class,继承于原来的类(extends和super方法)。

    1. class JQuery {
    2. constructor(selector) {
    3. let domList = document.querySelectorAll(selector);
    4. for (let index in domList) {
    5. this[index] = domList[index];
    6. }
    7. this.length = domList.length;
    8. this.selector = selector;
    9. }
    10. get(index) {
    11. return this[index];
    12. }
    13. each(fn) {
    14. for (let index = 0; index < this.length; index++) {
    15. return fn(this.domList[index]);
    16. }
    17. }
    18. on(type, handler) {
    19. this.each(() => {
    20. document.addEventListener(type, handler.bind(this), false);
    21. });
    22. }
    23. }
    24. // 插件拓展,在原型上添加方法
    25. JQuery.prototype.dialog = (info) => {
    26. alert(info);
    27. };
    28. // 拓展性, 自己写一个类,继承自其他类,这样就可以在原来功能上,拓展自定义类
    29. class myJQuery extends JQuery {
    30. constructor(selector) {
    31. super(selector);
    32. }
    33. addClass(className) {
    34. console.log(className);
    35. }
    36. }