2021-03-02 00:21:08
ES6~ES10新增功能中,Proxy、Reflect、Promise对象和迭代(Iterator和for...of循环)是核心特性。以下是这些特性的详细解析:
1. Proxy作用:Proxy 用于定义对象的基本操作(如属性访问、赋值、枚举等)的自定义行为,相当于在目标对象前设置一个“拦截层”,实现对对象操作的过滤和改写。
核心特性:
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,输出 "默认值"(若属性不存在)应用场景:
作用:Reflect 是 ES6 提供的内置对象,封装了对象的底层操作(如属性访问、函数调用等),与 Proxy 的拦截方法一一对应。设计目的是将对象操作从 Object 转移到 Reflect,使代码更语义化。
核心方法:
与 Proxy 结合:Proxy 的拦截方法通常调用 Reflect 实现默认行为,例如:
const proxy = new Proxy({}, { get(target, prop) { return Reflect.get(target, prop) || '未定义'; }});优势:
作用:Promise 是异步编程的解决方案,表示一个异步操作的最终完成(或失败)及其结果值。
核心特性:
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));应用场景:
作用:提供统一的遍历接口,使数据结构(如数组、Map、Set)可被 for...of 循环遍历。
核心概念:
示例代码:
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}可迭代对象:
Generator 函数(ES6):生成器函数返回一个迭代器,通过 yield 控制执行流程:
function* gen() { yield 1; yield 2;}for (const val of gen()) console.log(val); // 输出 1, 2总结这些特性显著提升了 JavaScript 的灵活性和可维护性,是现代开发的重要基础。