diff options
Diffstat (limited to 'src/node_modules/es-abstract/2020/OrdinaryObjectCreate.js')
-rw-r--r-- | src/node_modules/es-abstract/2020/OrdinaryObjectCreate.js | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/node_modules/es-abstract/2020/OrdinaryObjectCreate.js b/src/node_modules/es-abstract/2020/OrdinaryObjectCreate.js new file mode 100644 index 0000000..29e7ad5 --- /dev/null +++ b/src/node_modules/es-abstract/2020/OrdinaryObjectCreate.js @@ -0,0 +1,46 @@ +'use strict'; + +var GetIntrinsic = require('../GetIntrinsic'); + +var $ObjectCreate = GetIntrinsic('%Object.create%', true); +var $TypeError = GetIntrinsic('%TypeError%'); +var $SyntaxError = GetIntrinsic('%SyntaxError%'); + +var IsArray = require('./IsArray'); +var Type = require('./Type'); + +var hasProto = !({ __proto__: null } instanceof Object); + +// https://www.ecma-international.org/ecma-262/6.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]]']; + if (additionalInternalSlotsList.length > 0) { + throw new $SyntaxError('es-abstract does not yet support internal slots'); + // internalSlotsList.push(...additionalInternalSlotsList); + } + // var O = MakeBasicObject(internalSlotsList); + // setProto(O, proto); + // return O; + + if ($ObjectCreate) { + return $ObjectCreate(proto); + } + if (hasProto) { + return { __proto__: proto }; + } + + if (proto === null) { + throw new $SyntaxError('native Object.create support is required to create null objects'); + } + var T = function T() {}; + T.prototype = proto; + return new T(); +}; |