js-----继承

子类继承父类

  • 继承 子类继承父类
  • 封装 为实例添加方法 为原型增长方法
  • 多态 重写或重载
  1. 原型链继承 将子类的原型对象 重写成一个父类的一个实例
子类.prototype = new 父类();  //把父类的全部属性 都变成子类的公有属性
复制代码
  • 缺点 改写子类的原型对象 会致使子类原型对象上的constructor 属性会被改写 须要从新指定继承后的constructor
  1. 借用构造函数继承 把父类的私有属性和方法即成为子类的私有属性和方法
  • 把父类当作普通函数 在子类的函数体中经过call执行父类的函数
  • call方法是用来 修改this的指向 函数A中经过this.xxx = xxx 添加的属性都添加到了B的实例身上
  • 特色 只能把父类的私有属性和方法继承子类的私有属性和方法
  1. 组合继承 原型链继承 + 借用构造函数继承
  • 缺点 父类的私有属性继承了两次 一次继承在了子类的公有属性上 一次继承在了子类的私有属性上
  1. 原型式继承 把父类的公有属性继承为子类的公有属性
  • 建立一个新的对象 而且对象的__proto__ 指向父类的prototype
  • 最后把这个新对象做为子类的原型
  • 建立一个对象 对象的__proto__指向obj Object.create(obj);
B.prototype = Object.create(A.prototype); // 建立一个指定原型的对象 建立一个对象,而且这个对象的 __proto__ 指向 A.prototype
B.prototype.constructor = B; // 原型式继承一样是修改 B 类原型的指向,因此须要从新指定构造函数
let b = new B(); 
复制代码
  1. 寄生组合继承 原型式继承 + 借用构造函数继承
  2. 冒充对象继承 在子类的构造函数中生成一个父类的实例 把父类的实例进行遍历 把属性都添加到子类的实例上

ES6 的 继承 extends 关键字 原理 寄生组合式继承

class A{
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    //公有方法----添加到原型上
    say(){
        console.log(`${this.name} say`);
    }
}
//继承
class B extends A{
    constructor(x,y,forName,forAge){
        super(forName,forAge);
        this.x = x;
        this.y = y;
    }
}
let b = new B('x','y','zhangsaan',12);
b.say();
复制代码

在使用 ES6 的 extends 关键字以前,必须使用 super(); super 表示父类的构造函数bash

相关文章
相关标签/搜索