MST

星途 面试题库

面试题:JavaScript 如何构建一个安全且可扩展的子类安全机制

设计一个JavaScript的类继承架构,要求子类具备严格的安全机制,包括但不限于对父类属性和方法的访问控制、防止恶意篡改原型等。同时,该架构要具有良好的可扩展性,以便在未来添加新的功能时不会破坏已有的安全机制。请详细描述你的设计思路,并给出关键代码示例。
33.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 访问控制
    • 使用WeakMap来实现对父类私有属性的保护。WeakMap的键是对象,且键所指向的对象若没有其他引用,会被垃圾回收机制回收,从而保证私有性。
    • 对于方法,可以通过闭包的方式将其封装在内部,只暴露需要公开的方法。
  2. 防止恶意篡改原型
    • 使用Object.freeze()方法冻结原型对象,防止在运行时对原型进行修改。
  3. 可扩展性
    • 通过在类的构造函数和原型方法中预留扩展点(例如钩子函数),以便在子类中可以安全地添加新功能,而不破坏已有的安全机制。

关键代码示例

// 父类
class Parent {
    constructor() {
        const privateData = new WeakMap();
        privateData.set(this, {
            secret: 'This is a secret'
        });
        this.getSecret = () => privateData.get(this).secret;
    }
}

// 子类
class Child extends Parent {
    constructor() {
        super();
        // 子类构造函数中的扩展点,可安全添加新功能
        this.newFeature = 'This is a new feature';
    }

    // 子类可重写父类方法,但需遵循安全机制
    getSecret() {
        // 调用父类方法获取秘密
        const secret = super.getSecret();
        return `Enhanced secret: ${secret}`;
    }
}

// 防止恶意篡改原型
Object.freeze(Parent.prototype);
Object.freeze(Child.prototype);

// 测试
const child = new Child();
console.log(child.getSecret()); // 输出: Enhanced secret: This is a secret
console.log(child.newFeature); // 输出: This is a new feature
// 尝试修改原型会失败,因为原型已被冻结
// Child.prototype.newMethod = function() {};  // 这行代码会在严格模式下抛出错误,非严格模式下无效