6096d26c8f2f7d67642f5be981e6be89172fa86263a5b326f681172a8e2d3d9dbd9367c02f8e9192ec8e49696539897fdb930fc9df0c489e7472ca3f860c6b 1.1 KB

1234567891011121314151617181920212223242526272829
  1. 'use strict';
  2. /* eslint-disable no-proto -- safe */
  3. var uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');
  4. var isObject = require('../internals/is-object');
  5. var requireObjectCoercible = require('../internals/require-object-coercible');
  6. var aPossiblePrototype = require('../internals/a-possible-prototype');
  7. // `Object.setPrototypeOf` method
  8. // https://tc39.es/ecma262/#sec-object.setprototypeof
  9. // Works with __proto__ only. Old v8 can't work with null proto objects.
  10. // eslint-disable-next-line es/no-object-setprototypeof -- safe
  11. module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {
  12. var CORRECT_SETTER = false;
  13. var test = {};
  14. var setter;
  15. try {
  16. setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');
  17. setter(test, []);
  18. CORRECT_SETTER = test instanceof Array;
  19. } catch (error) { /* empty */ }
  20. return function setPrototypeOf(O, proto) {
  21. requireObjectCoercible(O);
  22. aPossiblePrototype(proto);
  23. if (!isObject(O)) return O;
  24. if (CORRECT_SETTER) setter(O, proto);
  25. else O.__proto__ = proto;
  26. return O;
  27. };
  28. }() : undefined);