Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

防止对象被篡改有哪些方式【热度: 260】 #940

Open
yanlele opened this issue Sep 27, 2024 · 0 comments
Open

防止对象被篡改有哪些方式【热度: 260】 #940

yanlele opened this issue Sep 27, 2024 · 0 comments
Labels
JavaScript JavaScript 语法部分 阿里巴巴 公司标签
Milestone

Comments

@yanlele
Copy link
Member

yanlele commented Sep 27, 2024

关键词:防止对象篡改

在 JavaScript 中,可以通过以下几种方式防止对象被篡改:

一、使用Object.freeze()

  1. 功能:

    • 完全冻结一个对象,使其不能添加新属性、删除现有属性或修改现有属性的值。
    • 对嵌套对象也会进行深度冻结。
  2. 示例:

    const obj = {
      prop1: "value1",
      prop2: { nestedProp: "nestedValue" },
    };
    Object.freeze(obj);
    
    // 以下操作都会抛出错误
    obj.newProp = "newValue";
    delete obj.prop1;
    obj.prop1 = "newValue1";
    obj.prop2.nestedProp = "newNestedValue";

二、使用Object.seal()

  1. 功能:

    • 密封一个对象,阻止添加新属性和删除现有属性,但可以修改现有属性的值。
    • 对嵌套对象不进行深度密封。
  2. 示例:

    const obj = {
      prop1: "value1",
      prop2: { nestedProp: "nestedValue" },
    };
    Object.seal(obj);
    
    // 以下操作会抛出错误或不被允许
    obj.newProp = "newValue";
    delete obj.prop1;
    
    // 这个操作是允许的
    obj.prop1 = "newValue1";
    obj.prop2.nestedProp = "newNestedValue";

三、使用const声明对象引用

  1. 功能:

    • 使用const声明的变量不能被重新赋值,但对象本身的属性仍然可以被修改,除非使用上述冻结或密封的方法。
  2. 示例:

    const obj = { prop: "value" };
    // 以下操作会报错
    obj = { newProp: "newValue" };
    
    // 这个操作是允许的
    obj.prop = "newValue1";

四、使用代理(Proxy)进行拦截

  1. 功能:

    • 通过创建一个代理对象,可以拦截对目标对象的各种操作,如属性访问、赋值、删除等,并根据需要进行控制。
  2. 示例:

    const targetObject = { prop: "value" };
    const handler = {
      set(target, key, value) {
        throw new Error("Object is immutable.");
      },
      deleteProperty(target, key) {
        throw new Error("Object is immutable.");
      },
    };
    const immutableObject = new Proxy(targetObject, handler);
    
    // 以下操作都会抛出错误
    immutableObject.prop = "newValue";
    delete immutableObject.prop;
@yanlele yanlele added JavaScript JavaScript 语法部分 阿里巴巴 公司标签 labels Sep 27, 2024
@yanlele yanlele added this to the milestone Sep 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JavaScript JavaScript 语法部分 阿里巴巴 公司标签
Projects
None yet
Development

No branches or pull requests

1 participant