ObjectDefineProperties.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. 'use strict';
  2. var callBound = require('call-bound');
  3. var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
  4. var Get = require('./Get');
  5. var ToObject = require('./ToObject');
  6. var ToPropertyDescriptor = require('./ToPropertyDescriptor');
  7. var forEach = require('../helpers/forEach');
  8. var getOwnPropertyDescriptor = require('gopd');
  9. var OwnPropertyKeys = require('own-keys');
  10. var $push = callBound('Array.prototype.push');
  11. // https://262.ecma-international.org/6.0/#sec-objectdefineproperties
  12. /** @type {<T extends Record<PropertyKey, unknown> = {}>(O: T, Properties: object) => T} */
  13. module.exports = function ObjectDefineProperties(O, Properties) {
  14. var props = ToObject(Properties); // step 1
  15. var keys = OwnPropertyKeys(props); // step 2
  16. /** @type {[string | symbol, import('../types').Descriptor][]} */
  17. var descriptors = []; // step 3
  18. forEach(keys, function (nextKey) { // step 4
  19. var propDesc = ToPropertyDescriptor(getOwnPropertyDescriptor(props, nextKey)); // step 4.a
  20. if (typeof propDesc !== 'undefined' && propDesc['[[Enumerable]]']) { // step 4.b
  21. var descObj = Get(props, nextKey); // step 4.b.i
  22. var desc = ToPropertyDescriptor(descObj); // step 4.b.ii
  23. $push(descriptors, [nextKey, desc]); // step 4.b.iii
  24. }
  25. });
  26. forEach(descriptors, function (pair) { // step 5
  27. var P = pair[0]; // step 5.a
  28. var desc = pair[1]; // step 5.b
  29. DefinePropertyOrThrow(O, P, desc); // step 5.c
  30. });
  31. return O; // step 6
  32. };