1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- '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
- });
|