MST

星途 面试题库

面试题:JavaScript 反射API下如何实现对象属性的动态代理

在JavaScript里,基于反射API,实现一个通用的对象属性动态代理函数。该函数接收一个目标对象作为参数,返回一个代理对象,当访问代理对象不存在的属性时,自动通过反射API从目标对象查找同名属性,若目标对象也不存在,则返回一个默认值 'not found'。要求写出完整代码,并解释实现原理。
30.3万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function createDynamicProxy(target) {
    return new Proxy(target, {
        get(target, property) {
            if (Reflect.has(target, property)) {
                return Reflect.get(target, property);
            } else {
                return 'not found';
            }
        }
    });
}

// 使用示例
const originalObject = { name: 'John' };
const proxyObject = createDynamicProxy(originalObject);

console.log(proxyObject.name); // 输出: John
console.log(proxyObject.age); // 输出: not found

实现原理解释

  1. Proxy 构造函数Proxy 用于创建一个代理对象,它接收两个参数,第一个是目标对象 target,第二个是一个处理器对象,处理器对象包含了一系列的捕获器函数,这些函数定义了代理对象的行为。
  2. get 捕获器:在处理器对象中定义了 get 捕获器,当访问代理对象的属性时会触发这个捕获器。它接收三个参数:target(目标对象)、property(被访问的属性名)和 receiver(代理对象本身,在这个例子中未使用)。
  3. Reflect.has:使用 Reflect.has 方法检查目标对象是否具有指定的属性。Reflect.has 方法与 in 操作符类似,但是以函数形式调用。
  4. Reflect.get:如果目标对象存在指定属性,通过 Reflect.get 方法获取目标对象上该属性的值。Reflect.get 方法用于获取对象上指定属性的值,类似于 obj[key]obj.key 的操作,但以函数形式调用,更加灵活和安全。
  5. 默认返回值:如果目标对象不存在指定属性,则返回默认值 'not found'