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 atrybutwritablejest 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...inlub w metodach, które zwracają listę właściwości, np.Object.keys(). Jeśli atrybutenumerablejest 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 (pozawritabledofalse) mogą być modyfikowane. Jeśliconfigurablejest ustawione nafalse, nie możesz usunąć właściwości ani zmienić jej atrybutówenumerableiconfigurable, ale nadal możesz zmienić jej atrybutwritablenafalse(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); // falsePrzy próbie zmiany writable na false, dostajemy błąd:
Uncaught TypeError: Cannot redefine property: id

