MST

星途 面试题库

面试题:JavaScript 中如何模拟抽象类

请简述在JavaScript中模拟抽象类的方法,并通过代码示例展示如何定义一个抽象类以及尝试实例化它会出现什么情况。
25.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 模拟抽象类的方法
    • 在JavaScript中没有原生的抽象类概念,但可以通过几种方式模拟。一种常见的方式是利用ES6的类和 new.target 来实现。new.target 会返回通过 new 调用的构造函数,如果直接调用构造函数(而不是通过 new),new.targetundefined。我们可以在类的构造函数中检查 new.target,如果该类被直接实例化(而不是被继承类实例化),则抛出错误,以此模拟抽象类不能被直接实例化的特性。同时,可以定义一些抽象方法,在抽象类中抛出错误,要求子类必须重写这些方法。
  2. 代码示例
// 定义抽象类
class AbstractClass {
    constructor() {
        if (new.target === AbstractClass) {
            throw new Error('抽象类不能被直接实例化');
        }
    }
    // 抽象方法
    abstractMethod() {
        throw new Error('抽象方法必须在子类中实现');
    }
}

// 定义子类
class ConcreteClass extends AbstractClass {
    constructor() {
        super();
    }
    abstractMethod() {
        console.log('子类实现的抽象方法');
    }
}

// 尝试实例化抽象类
try {
    const abstractInstance = new AbstractClass();
} catch (error) {
    console.error(error.message);
}

// 实例化子类
const concreteInstance = new ConcreteClass();
concreteInstance.abstractMethod();
  • 在上述代码中:
    • 定义了 AbstractClass 作为抽象类,其构造函数检查 new.target,如果是直接实例化 AbstractClass,则抛出错误。abstractMethod 方法也抛出错误,因为抽象类中的这个方法应该由子类重写。
    • ConcreteClass 继承自 AbstractClass,并重写了 abstractMethod 方法。
    • 当尝试实例化 AbstractClass 时,会捕获到错误并打印错误信息。而实例化 ConcreteClass 并调用 abstractMethod 方法时,会输出子类实现的内容。