JS继承的四种方式

博客分类: 笔记 阅读次数: comments

JS继承的四种方式

js 继承的四种方式:

  1. 原型继承:

    将父类的实例作为子类的原型;简单易于实现:

    function Parent1() {
      	this.name = ['super1']
     	this.reName = function () {
        this.name.push('super111')
      }
    function Child1() {
    }
    Child1.prototype = new Parent1()
    var child11 = new Child1()
    
    
  2. 构造函数继承:

    使用父类的构造函数增强子类的实例,实际上就是复制父类的实例;

    通过 call,apple 复制父类的实例属性给子类(没用到原型),在创建的子类里面进行实例化

    function Parent1(){
    	this.sex = ['']
    	this.reName = function(){
    		this.name.push('super111')
    	}
    }
    function Child1(){
    	Parent1.call(this.sex)
        console.log(this.sex);
    }
    

    优点:可以复制多个父类的属性实例

  3. 组成继承:

    在子类里面用 call 或 apply 子类外,先加上原型父类再实例化子类

    function Animal(name) {
      //设置属性
      this.name = name; //设置实例方法
      this.eat = function() {
        return this.name + "正在吃饭";
      };
    }
    var pig = function(name) {
      Animal.apply(this, arguments); //复制父类的实例属性
    };
    pig.prototype = new Animal(); //给子类的原型为父类的实例
    

    优点:可以继承到原型属性和方法

    缺点:生成了两个实例,消耗内存

  4. 寄生继承

    实例话继承子类里用一个新变量实例化的父类对象,返回新变量

    function Animal(name) {
      //设置属性
      this.name = name; //设置实例方法
      this.eat = function() {
        return this.name + "正在吃饭";
      };
    }
    //创建一个子类
    function dog(name) {
      var quan = new Animal(); //子类里用一个新变量实例化父类对象,返回新变量,
      quan.name = "";
      return quan;
    }
    
    var dogs = new dog();
    

    优点:不限制调用方式,不管是 new,还是直接=,都可以

    缺点:实例的是父类的实例,不能多继承