12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- 'use strict';
- var hasPropertyDescriptors = require('has-property-descriptors');
- var GetIntrinsic = require('get-intrinsic');
- var $defineProperty = hasPropertyDescriptors() && GetIntrinsic('%Object.defineProperty%', true);
- var hasArrayLengthDefineBug = hasPropertyDescriptors.hasArrayLengthDefineBug();
- // eslint-disable-next-line global-require
- var isArray = hasArrayLengthDefineBug && require('../helpers/IsArray');
- var callBound = require('call-bind/callBound');
- var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
- // eslint-disable-next-line max-params
- module.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) {
- if (!$defineProperty) {
- if (!IsDataDescriptor(desc)) {
- // ES3 does not support getters/setters
- return false;
- }
- if (!desc['[[Configurable]]'] || !desc['[[Writable]]']) {
- return false;
- }
- // fallback for ES3
- if (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) {
- // a non-enumerable existing property
- return false;
- }
- // property does not exist at all, or exists but is enumerable
- var V = desc['[[Value]]'];
- // eslint-disable-next-line no-param-reassign
- O[P] = V; // will use [[Define]]
- return SameValue(O[P], V);
- }
- if (
- hasArrayLengthDefineBug
- && P === 'length'
- && '[[Value]]' in desc
- && isArray(O)
- && O.length !== desc['[[Value]]']
- ) {
- // eslint-disable-next-line no-param-reassign
- O.length = desc['[[Value]]'];
- return O.length === desc['[[Value]]'];
- }
- $defineProperty(O, P, FromPropertyDescriptor(desc));
- return true;
- };
|