美文网首页
与js原型链杠上了之new Parent继承与利用中间对象继承的

与js原型链杠上了之new Parent继承与利用中间对象继承的

作者: 岛在深海处 | 来源:发表于2018-08-08 13:57 被阅读0次

    首先看使用new Parent()赋值给Child.prototype的继承方式

    function Parent () {
        this.name = 'chenyou'
        this.age = 18
        this.eat = function(){console.log('吃饭')}
    }
    function Child () {
        Parent.call(this)
    }
    //这里使用new Parent()赋值给Child.prototype
    Child.prototype = new Parent()
    /*注意此处相当于新建一个constructor属性,
      而不是给__proto__中原有的属性赋值*/
    Child.prototype.constructor = Child 
    
    console.log(Child.prototype)
    console.log(new Child())
    

    打印结果如下:


    new Parent()直接赋值给Child.prototype的方式.png

    如果使用中间对象实现继承则效果不同:

    //这里使用中间对象
    function inherits(Child, Parent) {
        var F = function () {};
        F.prototype = Parent.prototype;
        Child.prototype = new F();
    
        Child.prototype.constructor = Child;
    }
    
    inherits(Child, Parent)
    
    console.log(Child.prototype)
    console.log(new Child())
    

    打印结果如下:


    使用中间对象实现继承.png

    总结:用父函数造一个新实例赋值给Child.prototype,这种方式的缺点是会把这个新实例自己的属性复制到子函数原型中,这种方式子函数创建对象时子实例的__ proto__又是指向了Child.prototype,而Child.prototype又是从父函数的实例那复制过来的,所以子实例的__ proto__中除了父函数的constructor和__ proto__还多了一些父实例的属性。使用中间对象则不会,因为这个中间对象的构造方法中没执行任何东西,从内存方面考虑也要优于前者

    相关文章

      网友评论

          本文标题:与js原型链杠上了之new Parent继承与利用中间对象继承的

          本文链接:https://www.haomeiwen.com/subject/jxvtbftx.html