Для чего Babel добавляет _defineProperty?

После компиляции, babel добавляет служебный метод:

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

Если я правильно понимаю, при первом вызове происходит простое присваивание значение в поле объекта, но не могу понять, почему при наличии поля в объекте вызывается Object.defineProperty.

В чем смысл таких манипуляций?


Пример:

Изначальный код

class MyClass extends BaseRoute {
  defineField = 123;
}

Скомпилированный код

Object.defineProperty(_exports, "__esModule", {
  value: true
});
_exports.default = void 0;

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

class MyClass extends _route.default {
  constructor(...args) {
     super(...args);

    _defineProperty(this, "defineField", 123);
  }
}

Ответы (1 шт):

Автор решения: Grundy

key in obj проверяет наличие поля в объекте, в том числе в прототипах, и если поле с таким именем уже есть в любом из прототипов, то определяется свойство, если нет - то оно создается с помощью присваивания, что в принципе создает свойства с теми же параметрами.

Единственная разница может быть, если в прототипе объявлен сеттер, тогда смысл в таком разделении действительно есть:

var proto = {
  get a() {
    console.log('getter a');
  },
  set a(v) {
    console.log('setter a');
  }
};

var obj = Object.create(proto);

console.log('a' in obj, obj.hasOwnProperty('a'))

obj['a'] = 10;

Object.defineProperty(obj, 'a', {
  value: 15,
  enumerable: true,
  configurable: true,
  writable: true
});

console.log('obj.a', obj.a, obj.hasOwnProperty('a'));

Однако не понятно, почему всегда не использоваться вариант с defineProperty.

→ Ссылка