ObjectDefineProperties.js 1.4 KB

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