继承

58 阅读1分钟

js 继承

  1. 原型链继承 构造函数、原型和实例之间的关系:每个构造函数都有一个原型对象,每个实例对象都会有个__proto__,指向构造函数的protoType , :获取对象的原型对象 getPrototypeOf

本质,修改原有构造函数的prototype 指向需继承的对象 。缺点:继承对象修改获取改变实例对象

    function Father(){
        this.isFang = true
    }
    function Sub(){
        this.x = 1
    }
    Sub.prototype = new Father()
  1. 借用构造函数,等于复制父类给子类
    function Father(){
        this.isFang = true
    }
    function Sub(){
         Father.call(this)
    }

相对于 在Sub(){Objct.assign(this,new Father())},, 不能继承原型方法

  1. 组合继承 原型链+构造函数
    function Father(){
        this.isFang = true
    }
    function Sub(){
         Father.call(this)  //这里会在this中拷贝一份父级对象
    }
    Sub.prototype = new Father()  // 这原型是父级实例  -- 所以对象上原型对象上会有相同的一份数据
  1. 原型式继承 利用一个空对象为中介,将某个对象直接赋值给空对象构造函数的原型
  2. 寄生式继承
  3. 寄生组合
function inheritPrototype(subType, superType){ 
var prototype = Object.create(superType.prototype); // 创建对象,创建父类原型的一个副本 
prototype.constructor = subType; // 增强对象,弥补因重写原型而失去的默认的constructor 属性 
subType.prototype = prototype; // 指定对象,将新创建的对象赋值给子类的原型 } // 父类初始化实例属性和原型属性 
function SuperType(name){ this.name = name; this.colors = ["red", "blue", "green"]; } 
SuperType.prototype.sayName = function(){ alert(this.name); };// 借用构造函数传递增强子类实例属性(支持传参和避免篡改) 
function SubType(name, age){ SuperType.call(this, name); this.age = age; } // 将父类原型指向子类 
inheritPrototype(SubType, SuperType); // 新增子类原型属性 
SubType.prototype.sayAge = function(){ alert(this.age); } 
var instance1 = new SubType("xyc", 23); 
var instance2 = new SubType("lxy", 23); 
instance1.colors.push("2"); // ["red", "blue", "green", "2"] instance1.colors.push("3"); // ["red", "blue", "green", "3"]

  1. class 继承