函数继承

一、通过原型实现继承

<script>
    // 父类构造函数;
    function Proson(name, age) {
      this.name = name;
      this.age = age;
      this.eat = function() {
        console.log('我叫'+this.name+'今年'+this.age)
      }
    }
    Proson.prototype.sleep = function() {
      console.log('我的技能是睡觉')
    }

	// 子类构造函数;
    function Son() {}

    /**
     *  只能继承实例的属性和方法不能继承原型的属性和方法;
     *  同时 constructor 指向错误不在指向原来的构造函数;
     */
    // Son.prototype =  Proson.prototype
    
    // 让son的原型指向proosn的实例(一个新的实例),通过原型达到继承;
    Son.prototype = new Proson('小红', 18)

    //指向改变之后要指回原构造函数;
    Son.prototype.constructor=Son;
    
    // 在改变指向后添加方法,
    Son.prototype.run = function() {
      console.log('run')
    }

    var fa = new Proson()
    var so = new Son()
    console.log(fa)
    console.log(so)
    console.log(so.sleep())
    console.dir(Proson)
    console.dir(Son)
  </script>

优点:简单易于实现,父类实例属性和方法,子类都可以访问;

缺点:创建子实例时,不能向父类的构造函数中传入参数;只能在改变指向的时候传入。

二、通过构造函数实现继承;

<script>
    function Proson(name, age) {
      this.name = name;
      this.age = age;
      this.eat = function() {
        console.log('我叫' + this.name + '今年' + this.age)
      }
    }
    
    Proson.prototype.sleep = function() {
      console.log('我的技能是睡觉')
    }

    function Son(name, age, score) {
      // 通过构造函数实现继承,
      // 只能继承实例的属性和方法,不能原型的方法
      Proson.call(this, name, age)
      this.score = score;
    }

    var fa = new Proson()
    var so = new Son('小红', 18, 90)

    console.log(fa)
    console.log(so)
    console.log(so.eat())
    console.dir(Proson)
    console.dir(Son)
  </script>

优点:

1、解决了子类构造函数向父类构造函数中传递参数的问题;

2、可以实现多继承(call或apply多个多个父类)

缺点:

1、不能继承原型上的属性或方法,只能继承父类实例上的属性和方法;

三、组合继承(原型+构造函数)

<script>
    // 父类的构造函数;
    function Proson(name, age) {
      this.name = name
      this.age = age
      this.eat = function() {
        console.log('我叫' + this.name + '今年' + this.age)
      }
    }
    Proson.prototype.sleep = function() {
      console.log('我的技能是睡觉')
    }

    // 子类构造函数;
    function Son(name, age, score) {
      /**
       * 通过构造函数实现继承父类的全部属性;
       */
      Proson.call(this, name, age)
      this.score = score
    }

    /**
     * 通过原型继承父类的原型上的方法
     */
    Son.prototype = new Proson()
    Son.prototype.skill = function () {
      console.log('skill');
    }
    // 实例化对象;
    var pro = new Proson()
    var so = new Son('小明', 18)

    console.log(pro, so)
    console.log(so.name)
    console.log(so.skill())
	console.log(so.eat())
  </script>

优点:

1、既可以继承父类的全部属性又可以继承父类的原型方法;

2、可以在实例化子类时,传入参数;

posted @ 2020-02-21 21:23  古怪精灵  阅读(754)  评论(0编辑  收藏  举报