JavaScript篇:ES6~ES10新增功能proxy、reflect、promise对象、迭代

JavaScript篇:ES6~ES10新增功能proxy、reflect、promise对象、迭代
最新回答
絮雨羽

2021-03-02 00:21:08

ES6~ES10新增功能中,Proxy、Reflect、Promise对象和迭代(Iterator和for...of循环)是核心特性。以下是这些特性的详细解析:

1. Proxy

作用:Proxy 用于定义对象的基本操作(如属性访问、赋值、枚举等)的自定义行为,相当于在目标对象前设置一个“拦截层”,实现对对象操作的过滤和改写。

核心特性

  • 拦截操作:支持13种拦截操作,例如:

    get(target, propKey, receiver):拦截属性读取(如 proxy.foo)。

    set(target, propKey, value, receiver):拦截属性设置(如 proxy.foo = v)。

    has(target, propKey):拦截 in 操作符(如 'foo' in proxy)。

    deleteProperty(target, propKey):拦截 delete 操作(如 delete proxy.foo)。

    ownKeys(target):拦截 Object.keys() 等属性遍历操作。

  • 元编程能力:通过拦截底层操作,实现对语言行为的动态修改。

示例代码

const obj = new Proxy({}, { get(target, prop) { console.log(`读取属性: ${prop}`); return target[prop] || '默认值'; }, set(target, prop, value) { console.log(`设置属性: ${prop} = ${value}`); target[prop] = value; return true; // 必须返回布尔值 }});obj.name = 'Proxy'; // 触发 setconsole.log(obj.name); // 触发 get,输出 "默认值"(若属性不存在)

应用场景

  • 数据验证(如拦截 set 操作确保属性值合法)。
  • 隐藏私有属性(通过 ownKeys 过滤以 _ 开头的属性)。
  • 实现观察者模式(属性变化时触发回调)。
2. Reflect

作用:Reflect 是 ES6 提供的内置对象,封装了对象的底层操作(如属性访问、函数调用等),与 Proxy 的拦截方法一一对应。设计目的是将对象操作从 Object 转移到 Reflect,使代码更语义化。

核心方法

  • Reflect.get(target, propKey, receiver):读取属性。
  • Reflect.set(target, propKey, value, receiver):设置属性。
  • Reflect.has(target, propKey):检查属性是否存在。
  • Reflect.deleteProperty(target, propKey):删除属性。
  • Reflect.ownKeys(target):返回所有属性名(包括 Symbol)。

与 Proxy 结合:Proxy 的拦截方法通常调用 Reflect 实现默认行为,例如:

const proxy = new Proxy({}, { get(target, prop) { return Reflect.get(target, prop) || '未定义'; }});

优势

  • 统一的对象操作接口,避免直接调用 Object 方法的复杂性。
  • 与 Proxy 配合实现更简洁的拦截逻辑。
3. Promise 对象

作用:Promise 是异步编程的解决方案,表示一个异步操作的最终完成(或失败)及其结果值。

核心特性

  • 状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。
  • 方法

    Promise.then(onFulfilled, onRejected):处理成功/失败结果。

    Promise.catch(onRejected):捕获错误。

    Promise.finally():无论成功失败都会执行。

    Promise.all():等待所有 Promise 完成。

    Promise.race():取第一个完成的 Promise。

    Promise.allSettled()(ES10):等待所有 Promise 结束(无论成功失败)。

示例代码

const fetchData = new Promise((resolve, reject) => { setTimeout(() => resolve('数据加载成功'), 1000);});fetchData .then(data => console.log(data)) .catch(err => console.error(err));

应用场景

  • 替代回调地狱,简化异步逻辑。
  • 结合 async/await(ES7)实现同步风格的异步代码。
4. 迭代(Iterator 和 for...of 循环)

作用:提供统一的遍历接口,使数据结构(如数组、Map、Set)可被 for...of 循环遍历。

核心概念

  • Iterator 接口:对象需实现 [Symbol.iterator] 方法,返回一个迭代器对象(包含 next() 方法)。
  • for...of 循环:自动调用迭代器的 next() 方法,直到返回 {done: true}。

示例代码

const arr = [1, 2, 3];const iterator = arr[Symbol.iterator]();console.log(iterator.next()); // {value: 1, done: false}// 使用 for...offor (const item of arr) { console.log(item); // 依次输出 1, 2, 3}

可迭代对象

  • 内置支持:数组、字符串、Map、Set、TypedArray。
  • 自定义迭代:通过实现 [Symbol.iterator] 方法。

Generator 函数(ES6):生成器函数返回一个迭代器,通过 yield 控制执行流程:

function* gen() { yield 1; yield 2;}for (const val of gen()) console.log(val); // 输出 1, 2总结
  • Proxy:通过拦截操作实现元编程,适用于数据验证、属性监控等场景。
  • Reflect:提供标准化的对象操作方法,与 Proxy 互补。
  • Promise:解决异步回调问题,支持链式调用和错误处理。
  • 迭代:统一遍历接口,结合 for...of 和 Generator 简化循环逻辑。

这些特性显著提升了 JavaScript 的灵活性和可维护性,是现代开发的重要基础。