如何在 JavaScript 中创建受保护的对象属性?


JavaScript 没有像其他一些语言那样具有特定的属性保护级别,但我们可以使用一些技巧来接近它。受保护的属性是指那些只能被对象某些方法访问且不会暴露给外部访问的属性。这个概念在防止非法访问信息方面很有用,因为只有特定的函数或方法才能读取或修改它。

创建受保护的对象属性的方法

使用闭包

闭包 在 JavaScript 中可以封装属性,并使其仅在某些函数内部可访问。

示例代码

function ProtectedObject(name, age) {
    // Private variables using closure
    let _name = name;
    let _age = age;

    return {
        getName() {
            return _name;
        },
        setName(newName) {
            _name = newName;
        },
        getAge() {
            return _age;
        },
        setAge(newAge) {
            _age = newAge;
        }
    };
}

const person = ProtectedObject('Pankaj Bind', 20);
console.log(person.getName());  
console.log(person.getAge());   
person.setName('Neeraj Bind');
console.log(person.getName());  
console.log(person._name);      

输出

ProtectedObject 函数将 name 和 age 定义为闭包内部的局部变量,使其无法从外部访问。

Pankaj Bind
20
Neeraj Bind
undefined

使用 WeakMap

ProtectedObject 函数将 name 和 age 定义为闭包内部的局部变量,使其无法从外部访问。

示例代码

const privateData = new WeakMap();

class ProtectedObject {
    constructor(name, age) {
        privateData.set(this, { name, age });
    }

    getName() {
        return privateData.get(this).name;
    }

    setName(newName) {
        privateData.get(this).name = newName;
    }

    getAge() {
        return privateData.get(this).age;
    }

    setAge(newAge) {
        privateData.get(this).age = newAge;
    }
}

const person = new ProtectedObject('JPankaj Bind', 20);
console.log(person.getName());  
console.log(person.getAge());   
person.setName('Neeraj Bind');
console.log(person.getName()); 
console.log(person.name); 

输出

privateData WeakMap 存储与实例关联的属性。由于 WeakMap 的键在实例方法之外不可访问,因此 name 和 age 受保护,无法直接从外部访问。

Pankaj Bind
20
Neeraj Bind
undefined

更新于: 2024年11月14日

8 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告