Przejdź do treści

Manipulacja obiektami w JavaScript - Object - JS

Tworzenie właściwości tylko do odczytu - defineProperty

Jak w języku JavaScript utworzyć zmienną tylko do odczytu?

(interpretuje: Internet Explorer 9, Firefox 4, Opera 12, Chrome oraz częściowo Internet Explorer 8)

Object.defineProperty(O, P, Attributes)
Parametry:
Object O - obiekt
String P - nazwa właściwości
Object Attributes - atrybuty deskryptora właściwości:
  • value - aktualna wartość właściwości (domyślnie: undefined)
  • Boolean writable - czy wartość może zostać zmieniona (domyślnie: false)
  • Function|Undefined get - funkcja która zostanie wywołana w celu pobrania wartości właściwości (domyślnie: undefined)
  • Function|Undefined set - funkcja która zostanie wywołana w celu ustawienia wartości właściwości (domyślnie: undefined)
  • Boolean enumerable - czy właściwość będzie dostępna w pętli for-in (domyślnie: false)
  • Boolean configurable - czy wartość albo deskryptor właściwości mogą zostać zmienione (domyślnie: false)
Wartość:
O - przekazany obiekt
Wyjątki:
TypeError - wartość O nie jest obiektem

Definiuje tzw. deskryptor właściwości, który pozwala sterować dostępem do podanej właściwości obiektu. Dzięki niemu możemy określić, np. aby podana właściwość obiektu nigdy nie mogła zostać zmieniona. Możemy również zdefiniować funkcje, które pozwolą przekształcić wartość właściwości przed jej zapisem lub zwróceniem do/z obiektu.

Zwróć uwagę, że wartość writable, enumerable i configurable domyślnie wynosi false. Dlatego jeśli ich nie podasz przy definiowaniu deskryptora, zostanie utworzona właściwość, której nie będzie można już później zmienić ani odczytać wewnątrz pętli for-in.

Przykład Object.defineProperty

var obj = {test: 3};
Object.defineProperty(obj, "p", {value: 1});
obj.p = 2;
obj.p;                                             // 1
for (var key in obj) key;                          // "test"
 
Object.defineProperty(obj, "dynamic", {
    get: function () {
        return obj.test * 2;
    },
    set: function (value) {
        obj.test = value < 0 ? NaN : value / 2;
    }
});
obj.dynamic;                                       // 6
obj.dynamic = 4;
obj.test                                           // 2
obj.dynamic = -1;
obj.test;                                          // NaN
 
Object.defineProperty(obj, "p", {writable: true}); // TypeError
Object.defineProperty(true, "p", {});              // TypeError
Object.defineProperty(1, "p", {});                 // TypeError
Object.defineProperty("test", "p", {});            // TypeError
Object.defineProperty(null, "p", {});              // TypeError

Komentarze

Zobacz więcej komentarzy

Facebook