You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
2.3 KiB
49 lines
2.3 KiB
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 |
|
});
|
|
|