面试题答案
一键面试JavaScript 反射 API 使用场景
- 运行时类型检查与操作:在大型应用中,特别是在基于类的架构中,可能需要在运行时检查对象的类型并动态操作其属性。例如,在一个表单验证库中,对于不同类型的输入组件(文本框、下拉框等)对应的对象,通过反射 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));
- 代理与拦截操作:使用
Proxy
和反射 API 结合,可以对对象的各种操作进行拦截和自定义处理。比如在一个数据缓存系统中,当获取对象属性时,如果属性值是从远程服务器获取的,且设置了缓存机制,就可以利用反射 API 在Proxy
的get
拦截器中处理属性获取逻辑,实现缓存功能。
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
(是否可配置)等属性。