MST

星途 面试题库

面试题:JavaScript中class定义类时,在继承场景下存在哪些安全隐患及如何防范?

假设有两个类class Animal { constructor() { this.health = 100; } } 和 class Dog extends Animal { constructor(name) { super(); this.name = name; } },从安全角度分析这个继承体系可能存在的问题,并说明如何进行改进以增强安全性。
45.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

可能存在的问题

  1. 属性直接暴露Animal类中的health属性直接在构造函数中定义,没有任何访问控制,这意味着在类外部可以随意访问和修改该属性,比如可能出现恶意代码直接将health设置为负数,破坏对象的状态。

改进措施

  1. 使用ES6的#私有字段:在Animal类中,将health属性改为私有字段,如下:
class Animal {
    #health = 100;
    constructor() {}
    getHealth() {
        return this.#health;
    }
    setHealth(value) {
        if (typeof value === 'number' && value >= 0 && value <= 100) {
            this.#health = value;
        } else {
            throw new Error('Invalid health value');
        }
    }
}

class Dog extends Animal {
    constructor(name) {
        super();
        this.name = name;
    }
}

这样,health属性在类外部无法直接访问和修改,只能通过getHealthsetHealth方法来操作,在setHealth方法中可以添加对health值的验证逻辑,增强安全性。