美文网首页
成长(15/2000)——面试题合集12

成长(15/2000)——面试题合集12

作者: Kiki_Q | 来源:发表于2021-06-21 15:58 被阅读0次

    继承

    • 原型链继承
      缺点:1.一个实例改变了原型的值,其他同样继承该原型的也会变化;
      2.新实例无法向父类构造函数传参。
      3.继承单一
    let Parent = function () {
        this.name = ['dq'] //地址,如果是dq是值
    }
    Parent.prototype.getName =  function () {
        return this.name;
    }
    
    function Child () {
        
    }
    
    Child.prototype = new Parent();
    Child.prototype.constructor = Child;
    
    const child = new Child();
    const child1 = new Child();
    child1.name[0] = "xz"
    console.log(child.name,child.getName);
    console.log(child1.name,child1.getName);
    
    • 构造函数继承
      解决了1.原型链继承中被修改的问题;
      2.继承单一的问题,可以call多个;
      3.无法向父类构造函数传参的问题

    缺点:1.无法访问父类的原型的方法和属性
    2.只继承了父类构造函数的属性,没有继承父类原型的属性。
    3、每个新实例都有父类构造函数的副本,臃肿。

    let Parent = function () {
        this.name = ['dq']
    }
    Parent.prototype.getName =  function () {
        return this.name;
    }
    
    //在子类的构造函数中,执行父类的构造函数,并且为其绑定子类的this
    function Child () {
        Parent.call(this,'xz')
    }
    
    const child = new Child();
    const child1 = new Child();
    
    child1.name[0] = 'wyb';
    console.log(child.name,child.getName);
    console.log(child1.name,child1.getName);
    // [ 'dq' ] undefined
    // [ 'wyb' ] undefined
    
    • 组合继承
      解决上面无法继承父类原型的问题
      特点:1、可以继承父类原型上的属性,可以传参,可复用。
         2、每个新实例引入的构造函数属性是私有的。
      缺点:每次实例化都会new一次parent实例(耗内存)
    let Parent = function () {
        this.name = ['dq']
    }
    Parent.prototype.getName =  function () {
        return this.name;
    }
    
    //在子类的构造函数中,执行父类的构造函数,并且为其绑定子类的this
    function Child () {
        Parent.call(this,'xz')
    }
    
    Child.prototype = new Parent();
    Child.prototype.constructor = Child;
    
    const child = new Child();
    const child1 = new Child();
    
    child1.name[0] = 'wyb';
    console.log(child.name,child.getName);
    console.log(child1.name,child1.getName);
    // [ 'dq' ] [Function]
    // [ 'wyb' ] [Function]
    
    • 寄生组合式继承
      解决上面的问题
      缺点:
    let Parent = function () {
        this.name = ['dq']
    }
    Parent.prototype.getName =  function () {
        return this.name;
    }
    
    //在子类的构造函数中,执行父类的构造函数,并且为其绑定子类的this
    function Child () {
        Parent.call(this,'xz')
    }
    
    Child.prototype = Parent.prototype;
    // Child.prototype = Object.create(Parent.prototype); //对原型的浅拷贝
    Child.prototype.constructor = Child;
    
    const child = new Child();
    const child1 = new Child();
    
    child1.name[0] = 'wyb';
    console.log(child.name,child.getName);
    console.log(child1.name,child1.getName);
    

    参考:
    1.js继承的6种方式

    1. JS实现继承的几种方式

    相关文章

      网友评论

          本文标题:成长(15/2000)——面试题合集12

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