如何用ES6 Proxy改写自引用数组,使其成为?

2026-04-27 21:171阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计713个文字,预计阅读时间需要3分钟。

如何用ES6 Proxy改写自引用数组,使其成为?

原文:

在 JavaScript 中,for...of 循环依赖对象是否实现了可迭代协议(iterable protocol),即对象必须拥有 Symbol.iterator 方法并返回一个迭代器(iterator)。当对 Proxy 对象执行 for (let v of p) 时,引擎会尝试读取 p[Symbol.iterator] —— 这是一个 Symbol 类型的 key,而你的原始代码中仅显式处理了 'length' 和 'push' 字符串属性,却忽略了所有 symbol 属性(包括 Symbol.iterator),导致返回值为 p(即代理本身),而非一个合法的迭代器函数,最终抛出 TypeError: p is not iterable。

要解决该问题,核心是:在 get 拦截器中放行所有 symbol 类型的属性访问,让底层数组的原生行为(如 Array.prototype[Symbol.iterator])正常生效。同时,为保证代理数组首次访问即包含自身,应在 get 中优先完成初始化(obj.push(p)),而非操作 p.push(p)(后者可能引发无限递归或代理状态混乱)。

阅读全文

本文共计713个文字,预计阅读时间需要3分钟。

如何用ES6 Proxy改写自引用数组,使其成为?

原文:

在 JavaScript 中,for...of 循环依赖对象是否实现了可迭代协议(iterable protocol),即对象必须拥有 Symbol.iterator 方法并返回一个迭代器(iterator)。当对 Proxy 对象执行 for (let v of p) 时,引擎会尝试读取 p[Symbol.iterator] —— 这是一个 Symbol 类型的 key,而你的原始代码中仅显式处理了 'length' 和 'push' 字符串属性,却忽略了所有 symbol 属性(包括 Symbol.iterator),导致返回值为 p(即代理本身),而非一个合法的迭代器函数,最终抛出 TypeError: p is not iterable。

要解决该问题,核心是:在 get 拦截器中放行所有 symbol 类型的属性访问,让底层数组的原生行为(如 Array.prototype[Symbol.iterator])正常生效。同时,为保证代理数组首次访问即包含自身,应在 get 中优先完成初始化(obj.push(p)),而非操作 p.push(p)(后者可能引发无限递归或代理状态混乱)。

阅读全文