We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Сводка

Метод Object.defineProperties() определяет новые или изменяет существующие свойства, непосредственно на объекте, возвращая этот объект.

Синтаксис

Object.defineProperties(obj, props)

Параметры

obj
Объект, на котором определяются новые или изменяются существующие свойства.
props
Объект, чьи собственные перечисляемые свойства представляют собой дескрипторы для создаваемых или изменяемых свойств. Дескрипторы свойств обладают следующими дополнительными ключами:
configurable
Равен true только в том случае, если тип этого дескриптора свойства может быть изменён и если свойство может быть удалено из содержащего его объекта.
Значение по умолчанию установлено в false.
enumerable
Равен true только в том случае, если это свойство можно увидеть через перечисление свойств содержащего его объекта.
Значение по умолчанию установлено в false.
value
Значение, ассоциированное со свойством. Может быть любым допустимым значением JavaScript (числом, объектом, функцией и т.д.).
Значение по умолчанию установлено в undefined.
writable
Равен true только в том случае, если значение, ассоциированное со свойством, может быть изменено с помощью оператора присваивания.
Значение по умолчанию установлено в false.
get
Функция, используемая как геттер свойства, либо undefined, если свойство не имеет геттера. Возвращаемое значение функции будет использоваться как значение свойства.
Значение по умолчанию установлено в undefined.
set
Функция, используемая как сеттер свойства, либо undefined, если свойство не имеет сеттера. Функция принимает единственным аргументом новое значение, присваиваемое свойству.
Значение по умолчанию установлено в undefined.

Возвращаемое значение

Объект, переданный в функцию.

Описание

Метод Object.defineProperties(), по сути, определяет все свойства, соответствующие собственным свойствам объекта props, на объекте obj.

Примеры

Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    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) {
      // NB: изменить при необходимости считать вызываемым что-то ещё, кроме функций.
      return typeof v === 'function';
    }

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

    var d = {};

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

      if (!isCallable(g) && g !== 'undefined') {
        throw new TypeError('bad get');
      }
      d.get = g;
    }
    if (hasProperty(desc, 'set')) {
      var s = desc.set;
      if (!isCallable(s) && 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 5.1 (ECMA-262)
Определение 'Object.defineProperties' в этой спецификации.
Стандарт Изначальное определение. Реализована в JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Object.defineProperties' в этой спецификации.
Стандарт  

Совместимость с браузерами

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Возможность Firefox (Gecko) Chrome Internet Explorer Opera Safari
Базовая поддержка 4.0 (2) 5 (предыдущие версии не проверялись) 9 11.60 5
Возможность Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
Базовая поддержка 4.0 (2) (Да) ? 11.50 (Да)

На основе таблицы совместимости Kangax.

Смотрите также

Метки документа и участники

Внесли вклад в эту страницу: tankakatan, Mingun
Обновлялась последний раз: tankakatan,