关键词:防止对象篡改
在 JavaScript 中,可以通过以下几种方式防止对象被篡改:
一、使用Object.freeze()
-
功能:
- 完全冻结一个对象,使其不能添加新属性、删除现有属性或修改现有属性的值。
- 对嵌套对象也会进行深度冻结。
-
示例:
1const obj = { 2 prop1: "value1", 3 prop2: { nestedProp: "nestedValue" }, 4}; 5Object.freeze(obj); 6 7// 以下操作都会抛出错误 8obj.newProp = "newValue"; 9delete obj.prop1; 10obj.prop1 = "newValue1"; 11obj.prop2.nestedProp = "newNestedValue";
二、使用Object.seal()
-
功能:
- 密封一个对象,阻止添加新属性和删除现有属性,但可以修改现有属性的值。
- 对嵌套对象不进行深度密封。
-
示例:
1const obj = { 2 prop1: "value1", 3 prop2: { nestedProp: "nestedValue" }, 4}; 5Object.seal(obj); 6 7// 以下操作会抛出错误或不被允许 8obj.newProp = "newValue"; 9delete obj.prop1; 10 11// 这个操作是允许的 12obj.prop1 = "newValue1"; 13obj.prop2.nestedProp = "newNestedValue";
三、使用const
声明对象引用
-
功能:
- 使用
const
声明的变量不能被重新赋值,但对象本身的属性仍然可以被修改,除非使用上述冻结或密封的方法。
- 使用
-
示例:
1const obj = { prop: "value" }; 2// 以下操作会报错 3obj = { newProp: "newValue" }; 4 5// 这个操作是允许的 6obj.prop = "newValue1";
四、使用代理(Proxy)进行拦截
-
功能:
- 通过创建一个代理对象,可以拦截对目标对象的各种操作,如属性访问、赋值、删除等,并根据需要进行控制。
-
示例:
1const targetObject = { prop: "value" }; 2const handler = { 3 set(target, key, value) { 4 throw new Error("Object is immutable."); 5 }, 6 deleteProperty(target, key) { 7 throw new Error("Object is immutable."); 8 }, 9}; 10const immutableObject = new Proxy(targetObject, handler); 11 12// 以下操作都会抛出错误 13immutableObject.prop = "newValue"; 14delete immutableObject.prop;
个人笔记记录 2021 ~ 2025