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 - obiektString
P - nazwa właściwościObject
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ętlifor-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