Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 1 | 'use strict'; |
| 2 | |
Tim van der Lippe | 2c89197 | 2021-07-29 15:22:50 | [diff] [blame] | 3 | var GetIntrinsic = require('get-intrinsic'); |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 4 | |
| 5 | var $ObjectCreate = GetIntrinsic('%Object.create%', true); |
Nikolay Vitkov | d76576c | 2024-12-02 14:10:15 | [diff] [blame] | 6 | var $TypeError = require('es-errors/type'); |
| 7 | var $SyntaxError = require('es-errors/syntax'); |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 8 | |
Nikolay Vitkov | d76576c | 2024-12-02 14:10:15 | [diff] [blame] | 9 | var IsArray = require('./IsArray'); |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 10 | var Type = require('./Type'); |
| 11 | |
Nikolay Vitkov | d76576c | 2024-12-02 14:10:15 | [diff] [blame] | 12 | var forEach = require('../helpers/forEach'); |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 13 | |
Nikolay Vitkov | d76576c | 2024-12-02 14:10:15 | [diff] [blame] | 14 | var SLOT = require('internal-slot'); |
| 15 | |
| 16 | var hasProto = require('has-proto')(); |
| 17 | |
| 18 | // https://262.ecma-international.org/6.0/#sec-objectcreate |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 19 | |
| 20 | module.exports = function ObjectCreate(proto, internalSlotsList) { |
| 21 | if (proto !== null && Type(proto) !== 'Object') { |
| 22 | throw new $TypeError('Assertion failed: `proto` must be null or an object'); |
| 23 | } |
Nikolay Vitkov | d76576c | 2024-12-02 14:10:15 | [diff] [blame] | 24 | var slots = arguments.length < 2 ? [] : internalSlotsList; // step 1 |
| 25 | if (arguments.length >= 2 && !IsArray(slots)) { |
| 26 | throw new $TypeError('Assertion failed: `internalSlotsList` must be an Array'); |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 27 | } |
| 28 | |
Nikolay Vitkov | d76576c | 2024-12-02 14:10:15 | [diff] [blame] | 29 | var O; |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 30 | if ($ObjectCreate) { |
Nikolay Vitkov | d76576c | 2024-12-02 14:10:15 | [diff] [blame] | 31 | O = $ObjectCreate(proto); |
| 32 | } else if (hasProto) { |
| 33 | O = { __proto__: proto }; |
| 34 | } else { |
| 35 | if (proto === null) { |
| 36 | throw new $SyntaxError('native Object.create support is required to create null objects'); |
| 37 | } |
| 38 | var T = function T() {}; |
| 39 | T.prototype = proto; |
| 40 | O = new T(); |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 41 | } |
| 42 | |
Nikolay Vitkov | d76576c | 2024-12-02 14:10:15 | [diff] [blame] | 43 | if (slots.length > 0) { |
| 44 | forEach(slots, function (slot) { |
| 45 | SLOT.set(O, slot, void undefined); |
| 46 | }); |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 47 | } |
Nikolay Vitkov | d76576c | 2024-12-02 14:10:15 | [diff] [blame] | 48 | |
| 49 | return O; // step 6 |
Tim van der Lippe | fdbd42e | 2020-04-07 14:14:36 | [diff] [blame] | 50 | }; |