如何在 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 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告