Разница между get/set и Object.defineProperty в шаблоне модуля

Я видел два разных способа реализации геттеров/сеттеров в шаблоне модуля. Один использует «defineProperty», а другой нет. Каковы преимущества/недостатки одного по сравнению с другим?

var MyModule = (function() {

  var _val;

  var api = {
    get value1() {
      return _val
    },
    set value1(value) {
      _val = value
    }
  };

  Object.defineProperty(api, 'value2', {
    get: function() {
      return _val;
    },
    set: function(value) {
      _val = value
    }
  });
  return api;

}());

https://plnkr.co/edit/TbJSD4noZTew8II83eTH?p=preview


person Skyler    schedule 12.01.2017    source источник


Ответы (3)


Используя синтаксис getter, вы создаете свойство, которое , до ES2015 вам нужно было знать имя во время написания кода.

Object.defineProperty позволяет выполнить то же, что и выше, но даже до ES2015 не требует, чтобы вы заранее знали имя свойства. Это также позволяет вам решить, является ли свойство настраиваемым, перечисляемым или доступным для записи, что невозможно при использовании синтаксиса get/set.

Чтобы ответить на ваш точный вопрос: ни один из них не лучше. Они для разных ситуаций. Синтаксис get/set проще для чтения и записи, но он не такой мощный, как Object.defineProperty.

person Mike Cluck    schedule 12.01.2017

Как указано в документации.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Обычное добавление свойств через присваивание создает свойства, которые отображаются во время перечисления свойств (цикл for...in или метод Object.keys), значения которых могут быть изменены, а также могут быть удалены. Этот метод позволяет изменить эти дополнительные детали по умолчанию. По умолчанию значения, добавляемые с помощью Object.defineProperty(), неизменяемы.

person Michal Takáč    schedule 12.01.2017

Одно «преимущество» Object.defineProperty по сравнению с нотацией get/set заключается в том, что defineProperty можно использовать в любое время, даже для уже созданных объектов (для которых вы не можете использовать сокращенную нотацию «get»). Из мдн:

Чтобы добавить геттер к существующему объекту позже в в любое время используйте Object.defineProperty().

person Scott Weaver    schedule 12.01.2017