12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- 'use strict';
- var GetIntrinsic = require('get-intrinsic');
- var IsCallable = require('es-abstract/2023/IsCallable');
- var Type = require('es-abstract/2023/Type');
- var whichBuiltinType = require('which-builtin-type');
- var $TypeError = require('es-errors/type');
- var $gPO = GetIntrinsic('%Object.getPrototypeOf%', true);
- var $ObjectPrototype = GetIntrinsic('%Object.prototype%');
- var hasProto = [].__proto__ === Array.prototype; // eslint-disable-line no-proto
- module.exports = function getPrototypeOf(O) {
- if (Type(O) !== 'Object') {
- throw new $TypeError('Reflect.getPrototypeOf called on non-object');
- }
- if ($gPO) {
- return $gPO(O);
- }
- if (hasProto) {
- // eslint-disable-next-line no-proto
- var proto = O.__proto__;
- if (proto || proto === null) {
- return proto;
- }
- }
- var type = whichBuiltinType(O);
- if (type) {
- var intrinsic = GetIntrinsic('%' + type + '.prototype%', true);
- if (intrinsic) {
- return intrinsic;
- }
- }
- if (IsCallable(O.constructor)) {
- return O.constructor.prototype;
- }
- if (O instanceof Object) {
- return $ObjectPrototype;
- }
- /*
- * Correctly return null for Objects created with `Object.create(null)` (shammed or native) or `{ __proto__: null}`. Also returns null for
- * cross-realm objects on browsers that lack `__proto__` support (like IE <11), but that's the best we can do.
- */
- return null;
- };
|