diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a33f9452e19..78ff804b4b9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - `Promise.withResolvers` - Moved to stable ES, [November 2023 TC39 meeting](https://twitter.com/robpalmer2/status/1729216597623976407) - Added `es.` namespace module, `/es/` and `/stable/` namespaces entries +- Fixed a web incompatibility issue of [`Iterator` helpers proposal](https://github.com/tc39/proposal-iterator-helpers), [proposal-iterator-helpers/287](https://github.com/tc39/proposal-iterator-helpers/pull/287) and some following changes, November 2023 TC39 meeting - Added [`Uint8Array` to / from base64 and hex stage 2 proposal](https://github.com/tc39/proposal-arraybuffer-base64): - Methods: - `Uint8Array.fromBase64` diff --git a/packages/core-js/modules/esnext.iterator.constructor.js b/packages/core-js/modules/esnext.iterator.constructor.js index bc66c7ccceec..df222d90aaf4 100644 --- a/packages/core-js/modules/esnext.iterator.constructor.js +++ b/packages/core-js/modules/esnext.iterator.constructor.js @@ -2,19 +2,24 @@ var $ = require('../internals/export'); var global = require('../internals/global'); var anInstance = require('../internals/an-instance'); +var anObject = require('../internals/an-object'); var isCallable = require('../internals/is-callable'); var getPrototypeOf = require('../internals/object-get-prototype-of'); -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); +var defineBuiltInAccessor = require('../internals/define-built-in-accessor'); +var createProperty = require('../internals/create-property'); var fails = require('../internals/fails'); var hasOwn = require('../internals/has-own-property'); var wellKnownSymbol = require('../internals/well-known-symbol'); var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype; +var DESCRIPTORS = require('../internals/descriptors'); var IS_PURE = require('../internals/is-pure'); +var CONSTRUCTOR = 'constructor'; +var ITERATOR = 'Iterator'; var TO_STRING_TAG = wellKnownSymbol('toStringTag'); var $TypeError = TypeError; -var NativeIterator = global.Iterator; +var NativeIterator = global[ITERATOR]; // FF56- have non-standard global helper `Iterator` var FORCED = IS_PURE @@ -28,12 +33,27 @@ var IteratorConstructor = function Iterator() { if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable'); }; -if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) { - createNonEnumerableProperty(IteratorPrototype, TO_STRING_TAG, 'Iterator'); -} +var defineIteratorPrototypeAccessor = function (key, value) { + if (DESCRIPTORS) { + defineBuiltInAccessor(IteratorPrototype, key, { + configurable: true, + get: function () { + return value; + }, + set: function (replacement) { + anObject(this); + if (this === IteratorPrototype) throw new $TypeError("You can't redefine this property"); + if (hasOwn(this, key)) this[key] = replacement; + else createProperty(this, key, replacement); + } + }); + } else IteratorPrototype[key] = value; +}; + +if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR); -if (FORCED || !hasOwn(IteratorPrototype, 'constructor') || IteratorPrototype.constructor === Object) { - createNonEnumerableProperty(IteratorPrototype, 'constructor', IteratorConstructor); +if (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) { + defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor); } IteratorConstructor.prototype = IteratorPrototype;