'use strict'; var $ = require('../internals/export'); var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var isObject = require('../internals/is-object'); var isDataDescriptor = require('../internals/is-data-descriptor'); var fails = require('../internals/fails'); var definePropertyModule = require('../internals/object-define-property'); var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor'); var getPrototypeOf = require('../internals/object-get-prototype-of'); var createPropertyDescriptor = require('../internals/create-property-descriptor'); // `Reflect.set` method // https://tc39.es/ecma262/#sec-reflect.set function set(target, propertyKey, V /* , receiver */) { var receiver = arguments.length < 4 ? target : arguments[3]; var ownDescriptor = getOwnPropertyDescriptorModule.f(anObject(target), propertyKey); var existingDescriptor, prototype, setter; if (!ownDescriptor) { if (isObject(prototype = getPrototypeOf(target))) { return set(prototype, propertyKey, V, receiver); } ownDescriptor = createPropertyDescriptor(0); } if (isDataDescriptor(ownDescriptor)) { if (ownDescriptor.writable === false || !isObject(receiver)) return false; if (existingDescriptor = getOwnPropertyDescriptorModule.f(receiver, propertyKey)) { if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false; existingDescriptor.value = V; definePropertyModule.f(receiver, propertyKey, existingDescriptor); } else definePropertyModule.f(receiver, propertyKey, createPropertyDescriptor(0, V)); } else { setter = ownDescriptor.set; if (setter === undefined) return false; call(setter, receiver, V); } return true; } // MS Edge 17-18 Reflect.set allows setting the property to object // with non-writable property on the prototype var MS_EDGE_BUG = fails(function () { var Constructor = function () { /* empty */ }; var object = definePropertyModule.f(new Constructor(), 'a', { configurable: true }); // eslint-disable-next-line es/no-reflect -- required for testing return Reflect.set(Constructor.prototype, 'a', 1, object) !== false; }); $({ target: 'Reflect', stat: true, forced: MS_EDGE_BUG }, { set: set });