MST

星途 面试题库

面试题:JavaScript 类和构造函数的继承安全设计

在 JavaScript 类的继承体系中,假设父类构造函数有一些安全敏感的初始化操作,如何确保子类在继承和实例化过程中不会破坏这些安全机制,举例说明实现方式。
33.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 使用super关键字
    • 在 JavaScript 中,当子类继承父类时,通过super关键字调用父类的构造函数,可以确保父类的安全敏感初始化操作得以执行。
    • 示例代码如下:
class Parent {
    constructor() {
        // 模拟安全敏感的初始化操作,比如设置安全标志
        this.securityFlag = true;
    }
}

class Child extends Parent {
    constructor() {
        // 调用父类构造函数
        super();
        // 子类自己的初始化操作,不会破坏父类的安全机制
        this.childProperty = 'child value';
    }
}

let child = new Child();
console.log(child.securityFlag); // true
console.log(child.childProperty); // 'child value'
  1. 避免在子类构造函数中过早修改父类属性
    • 确保在调用super()之后再进行子类特有的操作,防止在父类初始化完成之前干扰父类的安全敏感设置。
    • 例如,如果在super()调用之前尝试修改父类可能使用的属性,可能会导致安全机制被破坏。
class AnotherParent {
    constructor() {
        this.sensitiveData = 'protected data';
    }
}

class AnotherChild extends AnotherParent {
    constructor() {
        // 错误示范,在调用super之前访问或修改可能会影响父类安全机制的属性
        // this.sensitiveData = 'tampered data';
        super();
        // 正确做法,在super调用之后进行子类操作
        this.otherData = 'new data';
    }
}
  1. 封装和访问控制
    • 在父类中,使用闭包或WeakMap等技术来封装安全敏感的数据,使其对子类不可直接访问和修改。
    • 例如,使用WeakMap来存储敏感数据:
const privateData = new WeakMap();

class EncapsulatedParent {
    constructor() {
        const sensitiveInfo = 'confidential';
        privateData.set(this, sensitiveInfo);
    }

    getSensitiveInfo() {
        return privateData.get(this);
    }
}

class EncapsulatedChild extends EncapsulatedParent {
    constructor() {
        super();
        // 子类无法直接访问或修改父类的敏感数据
    }
}

let encapsulatedChild = new EncapsulatedChild();
console.log(encapsulatedChild.getSensitiveInfo()); // 'confidential'