Każda właściwość obiektu posiada ukryte atrybuty, które definiują jej zachowanie. Te atrybuty nie są widoczne w standardowym kodzie, ale mają kluczowe znaczenie dla działania i kontroli właściwości obiektów. Główne atrybuty właściwości to:

  1. Zapisywalna (writable): Określa, czy wartość właściwości może być zmieniona. Jeśli atrybut writable jest ustawiony na false, wartość właściwości jest tylko do odczytu, co oznacza, że nie możesz jej zmodyfikować po jej utworzeniu.
  2. Wyliczalna (enumerable): Określa, czy właściwość pojawi się w pętlach iteracyjnych, takich jak for...in lub w metodach, które zwracają listę właściwości, np. Object.keys(). Jeśli atrybut enumerable jest ustawiony na false, właściwość nie będzie uwzględniana w takich iteracjach.
  3. Konfigurowalna (configurable): Określa, czy właściwość może być usunięta z obiektu oraz czy jej atrybuty (poza writable do false) mogą być modyfikowane. Jeśli configurable jest ustawione na false, nie możesz usunąć właściwości ani zmienić jej atrybutów enumerable i configurable, ale nadal możesz zmienić jej atrybut writable na false (jeśli wcześniej był true).

Przykład 1: Zmiana writable na false

const user = {
  id: 1,
  username: 'johndoe',
  password: 's3cr3t'
};

// Zmieniamy 'writable' na 'false' dla 'password'
Object.defineProperty(user, 'password', {
  writable: false
});

user.password = 'newPassword'; // Próba zmiany hasła

console.log(user.password); // 's3cr3t'

Po ustawieniu writable: false, próba zmiany wartości password nie powiedzie się (bez wyświetlania błędu w trybie non-strict). Wartość password pozostaje niezmieniona, co jest przydatne, gdy chcemy zapobiec przypadkowej zmianie ważnych danych użytkownika.

Przykład 2: Zmiana enumerable na false

Object.defineProperty(user, 'password', {
  enumerable: false
});

for (const key in user) {
  console.log(key); // 'id', 'username'
}

Po ustawieniu enumerable: false dla password, właściwość ta nie będzie wyświetlana w pętlach for...in ani nie zostanie zwrócona przez Object.keys(user), co jest przydatne, gdy nie chcemy, aby wrażliwe dane były łatwo dostępne podczas enumeracji właściwości obiektu.

Przykład 3: Zmiana configurable na false

Object.defineProperty(user, 'id', {
  configurable: false,
  writable: false
});

Object.defineProperty(user, 'id', {
  writable: true // Próba zmiany 'writable' na 'true' po ustawieniu 'configurable' na 'false'
}); 

console.log(Object.getOwnPropertyDescriptor(user, 'id').writable); // false

Przy próbie zmiany writable na false, dostajemy błąd:

Uncaught TypeError: Cannot redefine property: id

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *