当前位置 主页 > 服务器问题 > Linux/apache问题 >

    这样回答继承可能面试官更满意

    栏目:Linux/apache问题 时间:2019-12-11 10:21

    9021年底了,突然想在这个最后一个月准备一下,试试机会,能否更进一步。所以开始准备一些基础知识,也随带总结出来给各位想换工作的同学。希望大家能找到自己想要的工作。祝大家好运!

    一、何为继承

    一个类获取另一个或者多个类的属性或者方法。继承可以使得子类具有父类的各种方法和属性。以免重复输出很多代码。

    二、继承的原理

    复制父类的方法和属性来重写子类的原型对象。

    三、原型链继承

    3.1 实现

    function Father() {
      this.text = '1';
    }
    Father.prototype.someFn = function() {
      console.log(1);
    }
    Father.prototype.someValue = '2';
    
    function Son(){
      this.text1 = 'text1';
    }
    // 函数原型指向构造函数的实例
    Son.prototype = new Father();
    
    

    3.2 优点

    1、简单易操作。

    3.3 缺点

    1、父类使用this声明的属性被所有实例共享。原因是实例化是父类一次性赋值到子类实例的原型上,它会将父类通过this声明的属性也赋值到子类原型上。例如在父类中一个数组值,在子类的多个实例中,无论哪一个实例去修改这个数组的值,都会影响到其他子类实例。

    2、创建子类实例时,无法向父类构造函数传参,不够灵活。

    四、借用构造函数(call)

    4.1 实现

    function Father(...arr) {
      this.some = '父类属性';
      this.params = arr;
    }
    Father.prototype.someFn = function() {
      console.log(1);
    }
    Father.prototype.someValue = '2';
    function Son(fatherParams, ...sonParams) {
      // Father的this指向Son的this
      // 使用call调用父类,Father将会立即被执行,并且将父类的Father的this执行Son
      // 的this。实例化子类,this将指向new期间创建的新对象,返回该新对象。
      Father.call(this, ...fatherParams);
      this.text = '子类属性';
      this.sonParams = sonParams;
    }
    var fatherParams = [];
    var sonParams = [];
    var sonInstance = new Son(fatherParams, ...sonParams);
    
    

    4.2 优点

    1、可以向父类传递参数。

    2、解决父类this声明的属性会被实例共享的问题。

    4.3 缺点

    1、只能继承父类通过this声明的属性/方法。不能继承父类prototype上的属性/方法。

    2、父类方法无法复用。每次实例化子类,都要执行父类函数。重新声明父类所定义的方法,无法复用。

    五、组合继承(call+new)

    原理:通过原型链继承来将this、prototype上的属性和方法继承制子类的原型对象上。使用借用构造函数来继承父类通过this声明的属性和方法在之子类的实例属性上。

    5.1 实现

    function Father(...arr) {
      this.some = '父类属性';
      this.params = arr;
    }
    Father.prototype.someFn = function() {
      console.log(1);
    }
    Father.prototype.someValue = '2';
    function Son(fatherParams, ...sonParams) {
      // 借用构造函数继承父类this什么的属性和方法到子类实例属性上
      Father.call(this, ...fatherParams);
      this.text = '子类属性';
      this.sonParams = sonParams;
    }
    // 原型链继承,将`this`和`prototype`声明的属性/方法继承至子类的`prototype`上
    Son.prototype = new Father('xxxxx');
    var fatherParams = [];
    var sonParams = [];
    var sonInstance = new Son(fatherParams, ...sonParams);