objeto js-resistente a manipulaciones

1. Objetos no extensibles

 Por defecto, todos los objetos son extensibles. Es decir, puede agregar propiedades y métodos a un objeto en cualquier momento:

let person = {"name": "xiaoMing"};
person.age = 18;
console.log(person); // {name: 'xiaoMing', age: 18}

De acuerdo con el ejemplo anterior, podemos ver que aunque la primera línea ha definido completamente el objeto persona, la segunda línea aún puede agregarle atributos.

Ahora, podemos usar el método Object.preventExtensions() para cambiar este comportamiento y evitar que otros agreguen propiedades y métodos a person:

let person = {"name": "xiaoMing"};
Object.preventExtensions(person);
person.age = 18;
console.log(person); // {name: 'xiaoMing'}

En el modo no estricto, la adición de propiedades y métodos a objetos no extensibles fallará de forma predeterminada. En modo estricto, agregar propiedades y métodos a objetos no extensibles generará un error.

Aunque los objetos no extensibles no pueden agregar propiedades y métodos, pueden modificar y eliminar miembros existentes. Además, podemos determinar si Object.isExtensible() puede extender un objeto:

let person = {"name": "xiaoMing"};
console.log(Object.isExtensible(person)); // true

Object.preventExtensions(person);
console.log(Object.isExtensible(person)); // false

2. Objetos sellados

 Un objeto sellado no es extensible y sus miembros existentes tienen el atributo [[ Configurable ]] establecido en falso. Esto significa que sus propiedades y métodos no se pueden eliminar, solo se pueden modificar los valores de propiedad. Para sellar un objeto, puedes usar el método Object.seal():

let person = {"name": "xiaoMing"};
Object.seal(person);

person.age = 18;
console.log(person); // {name: 'xiaoMing'}

delete person.name;
console.log(person); // {name: 'xiaoMing'}

En el modo no estricto, se ignora el comportamiento de agregar el atributo de edad, y la operación de intentar eliminar el atributo de nombre también se ignora, y el objeto de persona no se ve afectado de ninguna manera. En modo estricto, intentar agregar o eliminar miembros de un objeto generará un error.

Use el método Object.isExtensible() para determinar si el objeto está sellado. Además, dado que el objeto sellado no se puede extender, usar Object.isExtensible() para monitorear el objeto sellado también devolverá falso:

let person = {"name": "xiaoMing"};
console.log(Object.isExtensible(person)); // true
console.log(Object.isSealed(person)); // false

Object.freeze(person);
console.log(Object.isExtensible(person)); // false
console.log(Object.isSealed(person)); // true

3. Objetos congelados

El nivel más estricto de resistencia a la manipulación es la congelación de objetos. Los objetos congelados no son extensibles ni sellados, y el atributo [[Escribible]] de las propiedades de datos del objeto se establece en falso. Las propiedades del acceso aún se pueden escribir si la función [[Establecer]] está definida. Los objetos se pueden congelar utilizando el método Object.freeze().

let person = {"name": "xiaoMing"};
Object.freeze(person);

person.age = 18;
console.log(person); // {name: 'xiaoMing'}

delete person.name;
console.log(person); // {name: 'xiaoMing'}

person.name = "xiaoHong";
console.log(person); // {name: 'xiaoMing'}

Al igual que con el modo no escalable y sellado, en el modo no estricto, se ignoran las operaciones ilegales en objetos congelados. En modo estricto, se arrojará un error.

Use Object.isFrozen() para detectar si un objeto está congelado. Y debido a que los objetos congelados son tanto sellados como no extensibles, verificar objetos congelados con Object.isExtensible() y Object.isSealed() devolverá falso y verdadero, respectivamente:

let person = {"name": "xiaoMing"};
console.log(Object.isExtensible(person)); // true
console.log(Object.isSealed(person)); // false
console.log(Object.isFrozen(person)); // false

Object.freeze(person);
console.log(Object.isExtensible(person)); // false
console.log(Object.isSealed(person)); // true
console.log(Object.isFrozen(person)); // true

La congelación de objetos es necesaria para los autores de bibliotecas JS. Porque la biblioteca js tiene más miedo de que alguien modifique accidentalmente (o intencionalmente) los objetos principales de la biblioteca. Congelar (o sellar) los objetos principales de la biblioteca puede evitar que ocurran estos problemas.

referencia:

"Programación Avanzada en JavaScript" 3ra Edición

Supongo que te gusta

Origin blog.csdn.net/qq_38629292/article/details/126694265
Recomendado
Clasificación