'use strict'; var GetIntrinsic = require('get-intrinsic'); var $ObjectCreate = GetIntrinsic('%Object.create%', true); var $TypeError = require('es-errors/type'); var $SyntaxError = require('es-errors/syntax'); var IsArray = require('./IsArray'); var Type = require('./Type'); var forEach = require('../helpers/forEach'); var SLOT = require('internal-slot'); var hasProto = require('has-proto')(); // https://262.ecma-international.org/11.0/#sec-objectcreate module.exports = function OrdinaryObjectCreate(proto) { if (proto !== null && Type(proto) !== 'Object') { throw new $TypeError('Assertion failed: `proto` must be null or an object'); } var additionalInternalSlotsList = arguments.length < 2 ? [] : arguments[1]; if (!IsArray(additionalInternalSlotsList)) { throw new $TypeError('Assertion failed: `additionalInternalSlotsList` must be an Array'); } // var internalSlotsList = ['[[Prototype]]', '[[Extensible]]']; // step 1 // internalSlotsList.push(...additionalInternalSlotsList); // step 2 // var O = MakeBasicObject(internalSlotsList); // step 3 // setProto(O, proto); // step 4 // return O; // step 5 var O; if ($ObjectCreate) { O = $ObjectCreate(proto); } else if (hasProto) { O = { __proto__: proto }; } else { if (proto === null) { throw new $SyntaxError('native Object.create support is required to create null objects'); } var T = function T() {}; T.prototype = proto; O = new T(); } if (additionalInternalSlotsList.length > 0) { forEach(additionalInternalSlotsList, function (slot) { SLOT.set(O, slot, void undefined); }); } return O; };