--- title: Object.defineProperties() slug: Web/JavaScript/Reference/Global_Objects/Object/defineProperties tags: - ECMAScript 5 - JavaScript - Object - метод translation_of: Web/JavaScript/Reference/Global_Objects/Object/defineProperties ---
{{JSRef}}

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

{{EmbedInteractiveExample("pages/js/object-defineproperties.html")}}

Синтаксис

Object.defineProperties(obj, props)

Параметри

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

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

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

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

get
Функція, що виступає властивістю-гетером, або {{jsxref("undefined")}}, якщо гетера немає. Значення, що повертає функція, буде використане як значення властивості.
За замовчуванням {{jsxref("undefined")}}.
set
Функція, що виступає властивістю-сетером, або {{jsxref("undefined")}}, якщо сетера немає. Функція буде отримувати єдиним аргументом нове значення, що призначається властивості.
За замовчуванням {{jsxref("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;
}

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

Специфікація Статус Коментар
{{SpecName('ESDraft', '#sec-object.defineproperties', 'Object.defineProperties')}} {{Spec2('ESDraft')}}
{{SpecName('ES6', '#sec-object.defineproperties', 'Object.defineProperties')}} {{Spec2('ES6')}}
{{SpecName('ES5.1', '#sec-15.2.3.7', 'Object.defineProperties')}} {{Spec2('ES5.1')}} Початкове визначення. Реалізоване у JavaScript 1.8.5

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

{{Compat("javascript.builtins.Object.defineProperties")}}

Див. також