MST

星途 面试题库

面试题:JavaScript构造函数与this在继承中的运用

在JavaScript中,使用构造函数实现继承有多种方式,比如经典的原型链继承、借用构造函数继承等。请详细阐述`this`在这些不同继承方式中的变化以及作用,并编写代码示例展示如何通过组合继承(结合原型链继承和借用构造函数继承)实现一个`Animal`构造函数和它的子类`Dog`,要求`Dog`能继承`Animal`的属性和方法,同时有自己独特的方法`bark`。
44.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

this在不同继承方式中的变化及作用

原型链继承

  • 变化:在原型链继承中,子类的实例通过原型链访问父类的属性和方法。this在这种情况下,对于父类方法中访问的属性,是在查找原型链的过程中确定最终值。如果子类实例中没有找到该属性,会沿着原型链一直向上查找,直到找到为止或者到达原型链顶端(null)。
  • 作用this用于在对象的方法中访问对象自身的属性和方法。例如在父类方法中,this指向调用该方法的对象实例,这样通过原型链继承过来的方法,在执行时能正确访问到实例相关的数据。

借用构造函数继承

  • 变化:通过在子类构造函数中调用父类构造函数,并使用callapply方法,将父类构造函数中的this绑定到子类的实例上。这样,父类构造函数中对this的操作,实际上是在子类实例上进行操作,为子类实例创建了一份独立的属性副本。
  • 作用:主要作用是让子类实例拥有父类实例的属性,避免了原型链继承中可能出现的共享属性问题。通过将父类构造函数中的this绑定到子类实例,使得每个子类实例都有自己独立的属性,增强了实例之间的独立性。

组合继承实现代码示例

function Animal(name, age) {
    this.name = name;
    this.age = age;
    this.speak = function() {
        console.log(`${this.name} makes a sound.`);
    };
}

function Dog(name, age, breed) {
    // 借用构造函数继承
    Animal.call(this, name, age);
    this.breed = breed;
}

// 原型链继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.bark = function() {
    console.log(`${this.name} barks.`);
};

// 测试
const myDog = new Dog('Buddy', 3, 'Golden Retriever');
myDog.speak(); 
myDog.bark();