📜  JavaScript 反射方法(1)

📅  最后修改于: 2023-12-03 15:31:41.585000             🧑  作者: Mango

JavaScript 反射方法

JavaScript 中的反射(Reflection)是指一组 API,它们允许你在运行时动态地检查和操作 JavaScript 代码。反射 API 允许你获取和操作对象的属性和方法,以及获取和设置对象的原型。

Reflect API

Reflect 是一个 JavaScript 内置的全局对象,提供了一组操作对象的方法。Reflect API 易于使用,且提供了一组强大的功能,可以方便地完成各种操作。

下面是 Reflect API 的一些常用方法:

Reflect.get(target, propertyKey[, receiver])

获取对象的某个属性的值。

let obj = { x: 1 }
console.log(Reflect.get(obj, 'x')) // 1

以上代码会输出对象 obj 的 x 属性的值 1。

Reflect.set(target, propertyKey, value[, receiver])

设置对象的某个属性的值。

let obj = { x: 1 }
Reflect.set(obj, 'x', 2)
console.log(obj.x) // 2

以上代码会更改对象 obj 的 x 属性的值为 2。

Reflect.has(target, propertyKey)

判断对象是否有某个属性。

let obj = { x: 1 }
console.log(Reflect.has(obj, 'x')) // true
console.log(Reflect.has(obj, 'y')) // false

以上代码会判断对象 obj 是否有 x 和 y 属性,并分别输出结果为 true 和 false。

Reflect.construct(target, argumentsList[, newTarget])

以给定参数构造一个对象。

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,用于创建代理对象。代理对象可以拦截对象的某些行为,接收一些拦截方法,通过这些方法可以拦截对象的属性操作、方法调用等行为。

以下是 Proxy API 的一些常用方法:

new Proxy(target, handler)

创建代理对象。

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 的属性访问和属性修改操作,并在控制台输出日志。

handler.get(target, propertyKey, receiver)

拦截对象的属性访问操作。

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 属性访问操作,并在控制台输出日志。

handler.set(target, propertyKey, value, receiver)

拦截对象的属性修改操作。

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 属性修改操作,并在控制台输出日志。