如何在 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
廣告