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.

DefineOwnProperty.js 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. 'use strict';
  2. var GetIntrinsic = require('../GetIntrinsic');
  3. var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
  4. if ($defineProperty) {
  5. try {
  6. $defineProperty({}, 'a', { value: 1 });
  7. } catch (e) {
  8. // IE 8 has a broken defineProperty
  9. $defineProperty = null;
  10. }
  11. }
  12. var callBound = require('../helpers/callBound');
  13. var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
  14. // eslint-disable-next-line max-params
  15. module.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) {
  16. if (!$defineProperty) {
  17. if (!IsDataDescriptor(desc)) {
  18. // ES3 does not support getters/setters
  19. return false;
  20. }
  21. if (!desc['[[Configurable]]'] || !desc['[[Writable]]']) {
  22. return false;
  23. }
  24. // fallback for ES3
  25. if (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) {
  26. // a non-enumerable existing property
  27. return false;
  28. }
  29. // property does not exist at all, or exists but is enumerable
  30. var V = desc['[[Value]]'];
  31. // eslint-disable-next-line no-param-reassign
  32. O[P] = V; // will use [[Define]]
  33. return SameValue(O[P], V);
  34. }
  35. $defineProperty(O, P, FromPropertyDescriptor(desc));
  36. return true;
  37. };