Jak blokować obiekty w JavaScript

Lucjan Michałowski

Wprowadzenie

JavaScript zapewnia różne metody kontrolowania zachowania i zmienności obiektów. Wśród tych metod, Object.preventExtensionsObject.seal, and Object.freeze są szczególnie przydatne, jeśli chodzi o zarządzanie właściwościami obiektów. Metody te pozwalają programistom ustawić różne poziomy niezmienności i ograniczyć dodawanie lub usuwanie właściwości.

Object.preventExtensions

Metoda  Object.preventExtensions()  jest używana w JavaScript, aby zapobiec dodawaniu dalszych właściwości do obiektu. Gdy obiekt jest oznaczony jako nierozszerzalny, nie można dodawać do niego nowych właściwości, chociaż nadal można modyfikować lub usuwać istniejące właściwości.

Może to być przydatne w scenariuszach, w których chcesz wymusić określony zestaw właściwości i zapobiec przypadkowemu dodaniu lub modyfikacji struktury obiektu. Pomaga to w utrzymaniu integralności danych i zapobiega niezamierzonym zmianom ważnych właściwości obiektu. W niektórych przypadkach, gdy obiekt jest oznaczony jako nierozszerzalny, silniki JavaScript mogą dokonać pewnych optymalizacji, zakładając, że struktura obiektu nie ulegnie zmianie. Może to skutkować poprawą wydajności podczas dostępu do właściwości lub iteracji, ponieważ silnik nie musi sprawdzać, czy dodawane są nowe właściwości.

const user = {
    name: "John Doe",
    age: "25"
};

Object.preventExtensions(user);
Object.isExtensible(user); // false

user.age = 30; // Modyfikacja jest dozwolona
user.email = "johndoe@example.com"; // Dodanie nowej właściwości jest ignorowane lub powoduje błąd
delete user.name; // Usuwanie jest dozwolone

Object.seal

Metoda Object.seal()  w JavaScript służy do uszczelniania obiektu, co oznacza, że zapobiega dodawaniu nowych właściwości do obiektu i oznacza wszystkie istniejące właściwości jako niekonfigurowalne. Ważne jest, aby pamiętać, że Object.seal()  nie zmienia właściwości obiektu na tylko do odczytu. Nadal można modyfikować wartości istniejących właściwości, ale nie można dodawać, usuwać ani zmieniać konfigurowalności właściwości.

Uszczelniając obiekt, zapewniasz, że jego struktura pozostaje stała. Może to być przydatne, gdy chcesz zapobiec dodawaniu lub usuwaniu właściwości, jednocześnie umożliwiając modyfikację istniejących wartości właściwości. Pomaga to zachować integralność i oczekiwaną strukturę obiektu.

const user = {
    name: "John Doe",
    age: "25"
};

Object.seal(user);
Object.isSealed(user); // true

user.age = 30; // Modyfikacja jest dozwolona
user.email = "johndoe@example.com"; // Dodanie nowej właściwości jest ignorowane lub powoduje błąd
delete user.name; // Usunięcie jest ignorowane lub powoduje błąd

Object.freeze

Metoda Object.freeze() w JavaScript służy do zamrożenia obiektu, czyniąc go całkowicie niezmiennym. Zapobiega to dodawaniu nowych właściwości, modyfikowaniu istniejących właściwości i usuwaniu właściwości. Po zamrożeniu obiektu nie można zmienić jego stanu.

const user = {
    name: "John Doe",
    age: "25",
    address: {
        street: "Main St 1"
    }
};

Object.freeze(user);
Object.isFrozen(user); // true

user.age = 30; // Modyfikacja jest ignorowana lub powoduje błąd
user.email = "johndoe@example.com"; // Dodanie nowej właściwości jest ignorowane lub powoduje błąd
user.address.city = "London"; // Dodawanie nowych zagnieżdżonych właściwości jest dozwolone
delete user.name; // Usunięcie jest ignorowane lub powoduje błąd

Uczynienie obiektu niezmiennym zmniejsza ryzyko niedozwolonych modyfikacji jego właściwości. Może to być szczególnie istotne w przypadku wrażliwych danych lub obiektów, które nie powinny być modyfikowane. Jest to przydatne w scenariuszach, w których obiekt jest współdzielony w różnych częściach aplikacji lub przekazywany jako argument do funkcji, a zamrożenie go może pomóc zapewnić, że jego właściwości pozostaną spójne i niezmienione.

Właściwości zagnieżdżone

Należy zauważyć, że wszystkie powyższe metody zapewniają płytką niezmienność. Oznacza to, że podczas gdy właściwości zablokowanego obiektu nie mogą być dodawane, usuwane lub modyfikowane, jeśli właściwość odnosi się do obiektu, właściwości tego obiektu mogą być nadal zmieniane, chyba że są również zablokowane.

const user = {
    address: {
        street: "Main St 1"
    }
};

Object.freeze(user);
Object.isFrozen(user); // true
Object.isFrozen(user.address); // false

user.address.city = "London"; // Dodawanie nowych zagnieżdżonych właściwości jest dozwolone

Strict mode

Strict mode może pomóc zidentyfikować potencjalne problemy z kodem, który próbuje zmodyfikować zablokowany obiekt. Podczas próby zastosowania preventExtensions, seal albo freeze na obiekcie w trybie ścisłym, JavaScript wyrzuci błąd, zwykle TypeError, wskazujący, że operacja jest niedozwolona. Jeśli jednak spróbujesz zrobić to samo nie w trybie ścisłym, kod zakończy się niepowodzeniem „po cichu”.

Wnioski

Object.freeze, Object.preventExtensions i Object.seal to potężne narzędzia w JavaScript do zarządzania właściwościami obiektów i wymuszania niezmienności. Metody te pozwalają programistom kontrolować zmienność obiektów na różnych poziomach, w zależności od ich specyficznych wymagań. Korzystając z tych metod, można zapewnić integralność danych, wymusić strukturę obiektów i ograniczyć nieoczekiwane zachowania w kodzie JavaScript.

Poznaj mageek of j‑labs i daj się zadziwić, jak może wyglądać praca z j‑People!

Skontaktuj się z nami