esnext.iterator.constructor.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. 'use strict';
  2. var $ = require('../internals/export');
  3. var global = require('../internals/global');
  4. var anInstance = require('../internals/an-instance');
  5. var isCallable = require('../internals/is-callable');
  6. var getPrototypeOf = require('../internals/object-get-prototype-of');
  7. var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
  8. var fails = require('../internals/fails');
  9. var hasOwn = require('../internals/has-own-property');
  10. var wellKnownSymbol = require('../internals/well-known-symbol');
  11. var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;
  12. var IS_PURE = require('../internals/is-pure');
  13. var TO_STRING_TAG = wellKnownSymbol('toStringTag');
  14. var $TypeError = TypeError;
  15. var NativeIterator = global.Iterator;
  16. // FF56- have non-standard global helper `Iterator`
  17. var FORCED = IS_PURE
  18. || !isCallable(NativeIterator)
  19. || NativeIterator.prototype !== IteratorPrototype
  20. // FF44- non-standard `Iterator` passes previous tests
  21. || !fails(function () { NativeIterator({}); });
  22. var IteratorConstructor = function Iterator() {
  23. anInstance(this, IteratorPrototype);
  24. if (getPrototypeOf(this) === IteratorPrototype) throw $TypeError('Abstract class Iterator not directly constructable');
  25. };
  26. if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) {
  27. createNonEnumerableProperty(IteratorPrototype, TO_STRING_TAG, 'Iterator');
  28. }
  29. if (FORCED || !hasOwn(IteratorPrototype, 'constructor') || IteratorPrototype.constructor === Object) {
  30. createNonEnumerableProperty(IteratorPrototype, 'constructor', IteratorConstructor);
  31. }
  32. IteratorConstructor.prototype = IteratorPrototype;
  33. // `Iterator` constructor
  34. // https://github.com/tc39/proposal-iterator-helpers
  35. $({ global: true, constructor: true, forced: FORCED }, {
  36. Iterator: IteratorConstructor
  37. });