Object.defineProperty()

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);