📅  最后修改于: 2023-12-03 15:31:41.585000             🧑  作者: Mango
JavaScript 中的反射(Reflection)是指一组 API,它们允许你在运行时动态地检查和操作 JavaScript 代码。反射 API 允许你获取和操作对象的属性和方法,以及获取和设置对象的原型。
Reflect 是一个 JavaScript 内置的全局对象,提供了一组操作对象的方法。Reflect API 易于使用,且提供了一组强大的功能,可以方便地完成各种操作。
下面是 Reflect API 的一些常用方法:
获取对象的某个属性的值。
let obj = { x: 1 }
console.log(Reflect.get(obj, 'x')) // 1
以上代码会输出对象 obj 的 x 属性的值 1。
设置对象的某个属性的值。
let obj = { x: 1 }
Reflect.set(obj, 'x', 2)
console.log(obj.x) // 2
以上代码会更改对象 obj 的 x 属性的值为 2。
判断对象是否有某个属性。
let obj = { x: 1 }
console.log(Reflect.has(obj, 'x')) // true
console.log(Reflect.has(obj, 'y')) // false
以上代码会判断对象 obj 是否有 x 和 y 属性,并分别输出结果为 true 和 false。
以给定参数构造一个对象。
class Point {
constructor(x, y) {
this.x = x
this.y = y
}
}
let obj = Reflect.construct(Point, [1, 2])
console.log(obj instanceof Point) // true
console.log(obj.x, obj.y) // 1, 2
以上代码会使用 Reflect.construct 方法以参数 [1, 2] 构造一个 Point 对象,然后检查是否是 Point 类型,并输出对象的属性 x 和 y。
Proxy 是一组 API,用于创建代理对象。代理对象可以拦截对象的某些行为,接收一些拦截方法,通过这些方法可以拦截对象的属性操作、方法调用等行为。
以下是 Proxy API 的一些常用方法:
创建代理对象。
let obj = { x: 1 }
let handler = {
get(target, propertyKey, receiver) {
console.log(`getting ${propertyKey}`)
return Reflect.get(target, propertyKey, receiver)
},
set(target, propertyKey, value, receiver) {
console.log(`setting ${propertyKey} to ${value}`)
return Reflect.set(target, propertyKey, value, receiver)
}
}
let proxy = new Proxy(obj, handler)
proxy.x = 2 // setting x to 2
console.log(proxy.x) // getting x, 2
以上代码会创建一个代理对象 proxy,它能够拦截对象 obj 的属性访问和属性修改操作,并在控制台输出日志。
拦截对象的属性访问操作。
let obj = { x: 1 }
let handler = {
get(target, propertyKey, receiver) {
console.log(`getting ${propertyKey}`)
return Reflect.get(target, propertyKey, receiver)
}
}
let proxy = new Proxy(obj, handler)
console.log(proxy.x) // getting x, 1
以上代码会拦截对象 proxy 的 x 属性访问操作,并在控制台输出日志。
拦截对象的属性修改操作。
let obj = { x: 1 }
let handler = {
set(target, propertyKey, value, receiver) {
console.log(`setting ${propertyKey} to ${value}`)
return Reflect.set(target, propertyKey, value, receiver)
}
}
let proxy = new Proxy(obj, handler)
proxy.x = 2 // setting x to 2
console.log(proxy.x) // 2
以上代码会拦截对象 proxy 的 x 属性修改操作,并在控制台输出日志。