JS面向对象-继承

本篇主要是「JavaScript高级程序设计-面向对象的程序设计」一章中第三篇「继承」回顾的笔记

原型链

  1. 备注

    • 实现继承的主要方式
    • 利用原型让一个引用继承类型继承另一个引用类型的属性和方法
  2. 示例

    function SuperType() {
      this.property = true;
    }
    
    SuperType.prototype.getSuperValue = function() {
      return this.propety;
    }
    
    function SubType() {
      this.subproperty = false;
    }
    
    SubType.prototype = new SuperType();
    
    SubType.prototype.getSubValue = function() {
      return this.subproperty
    }
    
    

var instance = new SubType();
alert(instance.getSuperValue()); // true

   
   
   

## 借用构造函数

1. 基本思想

   * 在子类型构造函数内部调用超类型构造函数

2. 示例

   ```javascript
   function SuperType() {
     this.colors = ['red', 'blue', 'green']
   }
   
   function SubType() {
     // 继承SuperType
     SuperType.call(this);
   }
   
   var instance = new SubType();
   instance.colors.push('black');
   alert(instance.colors); // "red, blur, green, black"

组合继承

  1. 概念

    • 指的是将原型链和借用构造函数的技术组合到一块,发挥二者之长
  2. 思路

    • 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承
  3. 示例

    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;
    }
    
    // 继承方法
    SubType.prototype = new SuperType();
    Subtype.prototype.constructor = SubType;
    Subtype.prototype.sayAge = function() {
      alert(this.age);
    };
    
    var instance = new SubType('Matthew', 27);
    instance.colors.push('black');
    alert(instance.colors); // red, blue, green, black
    instance.sayName(); // Matthew
    instance.sayAge(); // 27
    

原型式继承

  1. 备注

    • 没有严格意义上的构造函数
    • 基于已有的对象创建对象,同时不必因此创建自定义类型
  2. 示例

    function object(o) {
      function F() {};
      F.prototype = o;
      return new F();
    }
    
    var person = {
      name: 'Matthew',
      friends: ['Wudan', 'Sanmao', 'MaP']
    };
    
    var anotherPerson = object(person);
    anotherPerson.name = 'BLSM';
    anotherPerson.friends.push('YQS');
    
    alert(person.friends); // 'Wudan', 'Sanmao', 'MaP', 'YQS'
    

寄生式继承

  1. 备注

    • 创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真的是它做了所有工作一样返回对象
  2. 示例

    function object(o) {
      function F() {};
      F.prototype = o;
      return new F();
    }
    
    function createAnother(original) {
      var clone = object(original);
      clone.sayHi = function() {
        alert('hi');
      }
      return clone;
    }
    
    var person = {
      name: 'Matthew',
      friends: ['Wudan', 'Sanmao', 'MaP']
    };
    
    var anotherPerson = createAnother(person);
    anotherPerson.sayHi(); // hi
    

寄生组合式继承

  1. 备注

    • 借用构造函数来继承属性,通过原型链的混成形式来继承方法
    • 不必为了指定子类型的原型而调用超类型的构造函数,我们所需要的无非是超类型原型的一个副本而已
  2. 示例

    function inheritPrototype(subType, superType) {
      var prototype = Object(superType.prototype);
      prototype.constructor = subType;
      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);
    
    SubTyper.prototype.sayAge = function() {
      alert(this.age);
    }