Для чего 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 шт):
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.