Object.defineProperties()

Метод Object.defineProperties() визначає нові або модифікує існуючі властивості прямо на об'єкті, вертаючи цей об'єкт.

Синтаксис

Object.defineProperties(obj, props)

Параметри

obj
Об'єкт, на якому визначаються чи модифікуються властивості.
props
Об'єкт, чиї ключі відображають імена властивостей, які треба визначити чи модифікувати, і чиї значення є об'єктами, що описують ці властивості. Кожне значення у props має бути або дескриптором даних, або дескриптором доступу; воно не може бути обома (детальніше читайте у Object.defineProperty()).
Дескриптори даних та дескриптори доступу можуть мати наступні необов'язкові ключі:
configurable
Дорівнює true тоді й тільки тоді, коли тип цього дескриптора властивості може бути змінений, і якщо властивість може бути видалена з відповідного об'єкта.
За замовчуванням false.
enumerable
Дорівнює true тоді й тільки тоді, коли ця властивість відображається під час переліку властивостей відповідного об'єкта.
За замовчуванням false.

Дескриптор даних також має наступні необов'язкові ключі:

value
Значення, пов'язане з властивістю. Може бути будь-яким з чинних значень JavaScript (числом, об'єктом, функцією і т.д.).
За замовчуванням undefined.
writable
Дорівнює true тоді й тільки тоді, коли значення, пов'язане з властивістю, може бути змінене оператором присвоєння.
За замовчуванням false.

Дескриптор доступу також має наступні необов'язкові ключі:

get
Функція, що виступає властивістю-гетером, або undefined, якщо гетера немає. Значення, що повертає функція, буде використане як значення властивості.
За замовчуванням undefined.
set
Функція, що виступає властивістю-сетером, або undefined, якщо сетера немає. Функція буде отримувати єдиним аргументом нове значення, що призначається властивості.
За замовчуванням undefined.

Якщо в дескриптора немає жодного з ключів value, writable, get або set, він сприймається як дескриптор даних. Якщо дескриптор має і value або writable, і get або set, викидається виняток.

Значення, що повертається

Об'єкт, переданий у функцію.

Опис

Метод Object.defineProperties, по суті, визначає всі властивості у відповідності до власних перелічуваних властивостей props на об'єкті obj.

Приклад

var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Привіт',
    writable: false
  }
  // і т.д., і т.п.
});

Поліфіл

За умови незміненого середовища виконання, де всі імена та властивості посилаються на свої первинні значення, метод Object.defineProperties є майже повністю еквівалентним (зауважте коментар у isCallable) наступній реімплементації у JavaScript:

function defineProperties(obj, properties) {
  function convertToDescriptor(desc) {
    function hasProperty(obj, prop) {
      return Object.prototype.hasOwnProperty.call(obj, prop);
    }

    function isCallable(v) {
      // Увага: відредагуйте за необхідності, якщо інші значення, крім функцій, доступні для виклику.
      return typeof v === 'function';
    }

    if (typeof desc !== 'object' || desc === null)
      throw new TypeError('bad desc');

    var d = {};

    if (hasProperty(desc, 'enumerable'))
      d.enumerable = !!desc.enumerable;
    if (hasProperty(desc, 'configurable'))
      d.configurable = !!desc.configurable;
    if (hasProperty(desc, 'value'))
      d.value = desc.value;
    if (hasProperty(desc, 'writable'))
      d.writable = !!desc.writable;
    if (hasProperty(desc, 'get')) {
      var g = desc.get;

      if (!isCallable(g) && typeof g !== 'undefined')
        throw new TypeError('bad get');
      d.get = g;
    }
    if (hasProperty(desc, 'set')) {
      var s = desc.set;
      if (!isCallable(s) && typeof s !== 'undefined')
        throw new TypeError('bad set');
      d.set = s;
    }

    if (('get' in d || 'set' in d) && ('value' in d || 'writable' in d))
      throw new TypeError('identity-confused descriptor');

    return d;
  }

  if (typeof obj !== 'object' || obj === null)
    throw new TypeError('bad obj');

  properties = Object(properties);

  var keys = Object.keys(properties);
  var descs = [];

  for (var i = 0; i < keys.length; i++)
    descs.push([keys[i], convertToDescriptor(properties[keys[i]])]);

  for (var i = 0; i < descs.length; i++)
    Object.defineProperty(obj, descs[i][0], descs[i][1]);

  return obj;
}

Специфікації

Сумісність з веб-переглядачами

BCD tables only load in the browser

Див. також