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:
- Zapisywalna (
writable
): Określa, czy wartość właściwości może być zmieniona. Jeśli atrybutwritable
jest ustawiony nafalse
, wartość właściwości jest tylko do odczytu, co oznacza, że nie możesz jej zmodyfikować po jej utworzeniu. - Wyliczalna (
enumerable
): Określa, czy właściwość pojawi się w pętlach iteracyjnych, takich jakfor...in
lub w metodach, które zwracają listę właściwości, np.Object.keys()
. Jeśli atrybutenumerable
jest ustawiony nafalse
, właściwość nie będzie uwzględniana w takich iteracjach. - Konfigurowalna (
configurable
): Określa, czy właściwość może być usunięta z obiektu oraz czy jej atrybuty (pozawritable
dofalse
) mogą być modyfikowane. Jeśliconfigurable
jest ustawione nafalse
, nie możesz usunąć właściwości ani zmienić jej atrybutówenumerable
iconfigurable
, ale nadal możesz zmienić jej atrybutwritable
nafalse
(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