Object.defineProperty() - визначає нову або змінює існуючу властивість об'єкта.
Object.defineProperty(obj , prop, descriptor );
obj - Об'єкт, на якому визначаються властивість.
prop - назва властивості.
descriptor - дескриптор властивості. Об'єкт який містить параметри властивості.
defineProperty() статичний метод Object дозволяє додавати або змінювати властивості об'єкта з вказаними параметрами.
Звичайне додавання властивостей через присвоювання (obj={p.1};) створює властивості, які можна побачити через перерахування властивостей (за допомогою циклу for ... in або методу Object.keys), чиї значення можуть бути змінені і які можуть бути видалені. Цей же метод дозволяє налаштувати ці додаткові деталі властивості.
Дескриптори властивостей, присутні в об'єктах, бувають двох основних типів: дескриптори даних і дескриптори доступу.
Дескриптор даних - це властивість, що має значення, яке може бути (а може і не бути) записуватися.
Дескриптор доступу - це властивість, що описується парою функцій - гетером і сетером. Дескриптор може бути тільки чимось одним з цих двох типів; він не може бути одночасно обома.
І дескриптор даних, і дескриптор доступу є об'єктами. Вони володіють наступними обов'язковими ключами:
Майте на увазі, що ці ключі не обов'язково повинні належати самому дескриптору властивості, якщо вони успадковані, вони так само будуть прийматися до уваги. Для збереження цих ключів за замовчуванням незмінними, ви можете заздалегідь заморозити Object.prototype, явно визначивши всі ключі, або встановити властивість __proto__ в null.
var obj={};
// використання __proto__
Object .defineProperty( obj , 'key' , {
__proto__ : null, // немає успадкованих властивостей
value : 'static' // по замовчуванню
});
var ob = {}; // створюємо об'єкт
// Приклад додавання властивостей до об'єкту через Object.defineProperty
Object.defineProperty( ob, 'a' , {
value : 7 ,
writable : true,
enumerable : true,
configurable : true
});
//ob.a=7;
var d = {}; // Створюємо об'єкт
Object.defineProperty( d, 't' , {
value : 6.3 ,
writable : false
});
d.t = 10; //спроба призначити значення
alert(d.t); //d.t не змінилося, d.t=6.3
var ob={text:'4'};
Object.defineProperty(ob, 'text', {
get:function(){return this._text; }, //зверніть увагу що назва має бути іншою за існуючу властивість, інакше виникне помилка: "Uncaught RangeError: Maximum call stack size exceeded"
set:function(value){ this._text=value+' '+(new Date()).toLocaleString(); }
});
ob.text='test';
alert(ob.text);