Javascript Замораживание, уплотнение и предотвращение расширения объекта

RedDeveloper
25.02.2023 11:30
Javascript Замораживание, уплотнение и предотвращение расширения объекта

Чтобы установить свойство в объекте, которое нельзя изменить, удалить или установить, вы можете использовать defineProperty или defineProperties.

Если вы хотите заблокировать весь объект, вы можете использовать для этого методы freeze, seal и preventExtensions.

Вы можете добавлять атрибуты, удалять атрибуты, изменять атрибуты, предотвращать расширения (preventExtensions).

Заморозить

Буквально означает "заморозить". Вы не можете добавлять атрибуты, удалять атрибуты или изменять атрибуты. Это то же самое, как если бы значение configable было установлено в false.

Значения небазовых типов, таких как объекты, массивы и т.д., ими все равно можно манипулировать.

Чтобы определить, заморожен ли объект, используйте Object.isFrozen(). Это вернет true, если объект заморожен, или false, если нет.

let obj = {
  a: 1,
  b: 2,
  c: {}
};
Object.freeze(obj);

obj.a = 2;
console.info(obj);
// {a: 1, b: 2, c: {}} => a 依然是 1 無法被覆寫

delete obj.a; // false => 無法刪除
console.info(obj);
// {a: 1, b: 2, c: {}}

obj.d = 4;
console.info(obj);
// {a: 1, b: 2, c: {}} => 無法新增

obj.c.say = 'Hello';
console.info(obj);
// {a: 1, b: 2, c: {say: 'Hello'}}
// obj.c 是一個物件,可以新增、修改、刪除,不受 freeze 影響

Seal

console.info(Object.isFrozen(obj));
// true

console.info(Object.isSealed(obj));
// true,不能覆寫、刪除、新增,等同被封閉

console.info(Object.isExtensible(obj));
// false => 不能擴充所以回傳 false

Запечатывает объект. Вы не можете добавлять атрибуты или удалять атрибуты, но существующие атрибуты могут быть изменены. Количество атрибутов не может быть изменено, но их содержимое может быть обновлено.

Использование: Object.seal(obj)

Чтобы определить, запечатан ли объект, используйте Object.isSealed(). Если он запечатан, то будет возвращено true, если нет - false.

let obj = {
  a: 1,
  b: 2,
  c: {}
};
Object.seal(obj);

obj.a = 2;
console.info(obj);
// {a: 2, b: 2, c: {}} => a 可以被覆寫

delete obj.a; // false => 但是不能刪除
console.info(obj);
// {a: 1, b: 2, c: {}}

obj.d = 4;
console.info(obj);
// {a: 1, b: 2, c: {}} => 也無法新增

obj.c.say = 'Hello';
console.info(obj);
// {a: 1, b: 2, c: {say: 'Hello'}}
// obj.c 是一個物件,可以新增、修改、刪除,不受 seal 影響

PreventExtensions

console.info(Object.isSealed(obj));
// true

console.info(Object.isFrozen(obj));
// false => 還能被覆寫,不是被凍結

console.info(Object.isExtensible(obj));
// false => 不能擴充所以回傳 false

Буквально предотвращает расширения. Таким образом, помимо добавления атрибутов, они могут быть удалены или изменены. Использование: Object.freeze(obj)

Замороженными объектами нельзя манипулировать, но только для атрибутов подуровня. Если свойство

Использование: Object.preventExtensions(obj)

let obj = {
  a: 1,
  b: 2,
  c: {}
};
Object.preventExtensions(obj);

obj.a = 2;
console.info(obj);
// {a: 2, b: 2, c: {}} => a 可以被覆寫

delete obj.a; // false => 可以刪除
console.info(obj);
// {b: 2, c: {}}

obj.d = 4;
console.info(obj);
// {b: 2, c: {}} => 但無法擴充所以不能新增

obj.c.say = 'Hello';
console.info(obj);
// {b: 2, c: {say: 'Hello'}}
// obj.c 是一個物件,可以新增、修改、刪除,不受 preventExtensions 影響

Чтобы определить, является ли объект расширяемым, используйте Object.isExtensible(). Если объект установлен на заморозку или печать, он вернет false, если не может добавлять атрибуты.

console.info(Object.isExtensible(obj));
// false => 因為被設置了 preventExtensions

console.info(Object.isFrozen(obj));
// false => 還能被覆寫,不是被凍結

console.info(Object.isSealed(obj));
// false => 可以修改、刪除,不是被封閉

Независимо от того, используете ли вы freeze, seal или preventExtensions, вы не сможете их снять, если они установлены, поэтому помните об этом, прежде чем использовать их. Однако есть способ сделать это с помощью Object.assign(), чтобы клонировать копию объекта и перезаписать исходные переменные. Если вы используете const для установки константы, вам не повезло.

let obj = {
  a: 1,
  b: 2,
  c: {}
};
Object.freeze(obj);
console.info(Object.isFrozen(obj)); // true

obj = Object.assign({}, obj);
console.info(Object.isFrozen(obj)); // false

// 如果用 const obj = {} 那就連 assign 也無法解除了
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit

20.03.2023 14:01

Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а также новые инструменты веб-скраппинга с открытым исходным кодом для их обхода.

Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра

20.03.2023 12:24

Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие действия:

ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023

20.03.2023 11:15

О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц. HTML обеспечивает структуру страницы CSS (визуальное и звуковое) оформление для различных устройств. Наряду с графикой и сценариями HTML и CSS являются...

Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular

20.03.2023 08:46

Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?

Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы

19.03.2023 13:43

Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем запускать наши php-файлы через localhost на наших компьютерах. Мне с трудом удалось установить его и я решил поделиться этой статьей, чтобы помочь тем,...

Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах

19.03.2023 13:03

При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после поставщика контекста. Это позволит избежать ненужных повторных рендеров.