esnext.iterator.constructor.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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 createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
  7. var fails = require('../internals/fails');
  8. var hasOwn = require('../internals/has-own-property');
  9. var wellKnownSymbol = require('../internals/well-known-symbol');
  10. var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;
  11. var IS_PURE = require('../internals/is-pure');
  12. var TO_STRING_TAG = wellKnownSymbol('toStringTag');
  13. var NativeIterator = global.Iterator;
  14. // FF56- have non-standard global helper `Iterator`
  15. var FORCED = IS_PURE
  16. || !isCallable(NativeIterator)
  17. || NativeIterator.prototype !== IteratorPrototype
  18. // FF44- non-standard `Iterator` passes previous tests
  19. || !fails(function () { NativeIterator({}); });
  20. var IteratorConstructor = function Iterator() {
  21. anInstance(this, IteratorPrototype);
  22. };
  23. if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) {
  24. createNonEnumerableProperty(IteratorPrototype, TO_STRING_TAG, 'Iterator');
  25. }
  26. if (FORCED || !hasOwn(IteratorPrototype, 'constructor') || IteratorPrototype.constructor === Object) {
  27. createNonEnumerableProperty(IteratorPrototype, 'constructor', IteratorConstructor);
  28. }
  29. IteratorConstructor.prototype = IteratorPrototype;
  30. // `Iterator` constructor
  31. // https://github.com/tc39/proposal-iterator-helpers
  32. $({ global: true, constructor: true, forced: FORCED }, {
  33. Iterator: IteratorConstructor
  34. });