MST

星途 面试题库

面试题:JavaScript 中反射 API 的基本使用场景

请简述 JavaScript 反射 API 在实际项目中的至少两个基本使用场景,并举例说明如何利用反射 API 获取对象的属性描述符。
13.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

JavaScript 反射 API 使用场景

  1. 运行时类型检查与操作:在大型应用中,特别是在基于类的架构中,可能需要在运行时检查对象的类型并动态操作其属性。例如,在一个表单验证库中,对于不同类型的输入组件(文本框、下拉框等)对应的对象,通过反射 API 可以在运行时检查对象是否具有特定验证方法属性,并调用该方法进行验证。
class TextInput {
    validate() {
        return true;
    }
}
class SelectInput {
    validate() {
        return true;
    }
}
function validateInput(input) {
    if (Reflect.has(input, 'validate')) {
        return Reflect.apply(input.validate, input, []);
    }
    return false;
}
let text = new TextInput();
let select = new SelectInput();
console.log(validateInput(text)); 
console.log(validateInput(select)); 
  1. 代理与拦截操作:使用 Proxy 和反射 API 结合,可以对对象的各种操作进行拦截和自定义处理。比如在一个数据缓存系统中,当获取对象属性时,如果属性值是从远程服务器获取的,且设置了缓存机制,就可以利用反射 API 在 Proxyget 拦截器中处理属性获取逻辑,实现缓存功能。
let target = {
    data: 'original data'
};
let handler = {
    get(target, property) {
        let cache = {};
        if (!cache[property]) {
            cache[property] = Reflect.get(target, property);
        }
        return cache[property];
    }
};
let proxy = new Proxy(target, handler);
console.log(proxy.data); 

获取对象的属性描述符

可以使用 Reflect.getOwnPropertyDescriptor 方法来获取对象的属性描述符。示例如下:

let obj = {
    name: 'John',
    age: 30
};
let nameDescriptor = Reflect.getOwnPropertyDescriptor(obj, 'name');
console.log(nameDescriptor); 

上述代码中,Reflect.getOwnPropertyDescriptor 方法接收两个参数,第一个参数是目标对象 obj,第二个参数是要获取描述符的属性名 name。执行后会返回属性 name 的描述符对象,其中包含诸如 value(属性值)、writable(是否可写)、enumerable(是否可枚举)、configurable(是否可配置)等属性。