Przejdź do treści

Object

defineProperty

(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.

Internet Explorer 8 poza trybem Quirks częściowo obsługuję tę funkcję - tylko w przypadku modelu DOM, czyli nie można jej używać dla obiektów stworzonych przez użytkownika. Ponadto nie działają atrybuty deskryptora: enumerable ani configurable.

Przykład:

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