MST

星途 面试题库

面试题:JavaScript中使用class关键字定义类时,如何防止属性被外部随意修改以保障安全?

请说明在JavaScript使用class关键字定义类时,从安全角度出发,如何避免外部代码随意修改类内部属性,比如有一个简单类class Person { constructor(name) { this.name = name; } },怎样改进这个类让name属性更安全?
48.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 使用WeakMap实现属性封装
    • 在JavaScript中,由于没有真正的私有属性,可借助WeakMap来模拟私有属性。WeakMap的键必须是对象,且键值对是弱引用,外部难以直接访问。
    • 示例代码如下:
const personWeakMap = new WeakMap();
class Person {
    constructor(name) {
        const privateData = {};
        privateData.name = name;
        personWeakMap.set(this, privateData);
    }
    getName() {
        const privateData = personWeakMap.get(this);
        return privateData? privateData.name : null;
    }
}
  1. 使用#私有字段(ES2020及以后)
    • ES2020引入了#私有字段语法。在类中使用#前缀定义的属性是真正的私有属性,外部代码无法直接访问和修改。
    • 示例代码如下:
class Person {
    #name;
    constructor(name) {
        this.#name = name;
    }
    getName() {
        return this.#name;
    }
}

在这两种方法中,第一种方法(使用WeakMap)兼容性更好,适用于较旧的JavaScript运行环境;第二种方法(使用#私有字段)是官方标准的私有属性实现方式,代码更简洁,但需要支持ES2020及以上的环境。