自定义原型Symbol.iterator指向内部数组迭代器返回空结果问题
问题原因
- 核心是数组迭代器方法的
this指向不符合预期:数组内置的Symbol.iterator方法执行时,依赖this指向要遍历的数组实例,从而读取数组的length和索引元素。 - 你的写法中,getter直接返回了
internalArray的Symbol.iterator方法本身,当你执行test[Symbol.iterator]()时,该方法的this会被绑定到test实例,而非内部的internalArray。迭代器读取test实例的length时得到undefined(会被转为0),因此直接返回结束状态。
修复方案
方案1:绑定迭代器方法的this指向
在getter返回方法时,将this绑定到内部数组即可:
Object.defineProperty(thing.prototype, Symbol.iterator, { get: function () { return this.internalArray[Symbol.iterator].bind(this.internalArray); } });
方案2:包装一层函数调用内部数组迭代器
直接返回一个新函数,函数内部调用内部数组的迭代器,利用箭头函数保留getter的this指向:
Object.defineProperty(thing.prototype, Symbol.iterator, { get: function () { return () => this.internalArray[Symbol.iterator](); } });
内容的提问来源于stack exchange,提问作者Arii
相关产品推荐
相关产品推荐

