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

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

Специфікація Статус Коментар
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.defineProperties' in that specification.
Draft
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.defineProperties' in that specification.
Standard
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.defineProperties' in that specification.
Standard Початкове визначення. Реалізоване у JavaScript 1.8.5

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
definePropertiesChrome Full support 5Edge Full support 12Firefox Full support 4IE Full support 9Opera Full support 11.6Safari Full support 5WebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support 12Safari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Див. також