1.原型链继承

<body>

<!--
重点:让新实例的原型等于父类的实例。

    特点:1、实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性。(新实例不会继承父类实例的属性!)

    缺点:1、新实例无法向父类构造函数传参。

       2、继承单一。

       3、所有新实例都会共享父类实例的属性。(原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原型属性也会被修改!)

-->

  <script>
    //父类型
    function Supper(P){
      this.subProp = P
    }
    Supper.prototype.showSupperProp = function(){
      console.log(this.subProp)
    }

    //子类型
    function Sub(){
      this.subP = 'Sub property'
    }
    //重点!!!下面这句
    Sub.prototype = new Supper('hhh')
    
    //重点!!
    Sub.prototype.constructor = Sub
    console.log(Sub.prototype)
    Sub.prototype.showSubProp = function(){
      console.log(this.subProp)
    }
    var sub = new Sub() //  新实例无法向父类构造函数传参。
    sub.showSupperProp()//sub是找作用域链,  .showSupperProp找的是原型链
    sub.toString()//能找到,能的原因是内部有条,Object.prototype有toString
    // showSupeerProp在Supper的prototype上
    // Sub.prototype={}
    // ***Supper上的实例能看到Supper.prototype
    // Sub.prototype=new Supper()
    sub.showSubProp()

    /*问题*/
    console.log(sub.constructor) //指向Super  因为Sub.prototype=new Super()
    //所以需要加上Sub.prototype.constructor = Sub

  </script>
</body>

 Sub.prototype = new Supper('hhh') //这句是为了让Sub得到Supper原型上的方法,而不是得到Supper实例上的属性,因为后面new出来的sub并不能改变这些属性


var sub = new Sub() // 新实例无法向父类构造函数传参。
posted @ 2019-10-22 16:18  燕子fly  阅读(222)  评论(0编辑  收藏  举报