MST

星途 面试题库

面试题:JavaScript数据拦截的复杂应用

假设有一个包含嵌套对象的JavaScript对象,例如:{a: {b: 1}}。请使用Proxy实现一个深度的数据拦截功能,当对任何层级的属性进行赋值操作时,记录下属性路径和新值,并在赋值后检查新值是否为数字类型,如果不是则抛出一个错误。
41.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function deepDataInterceptor(target) {
    return new Proxy(target, {
        set(target, property, value, receiver) {
            let path = [];
            let current = target;
            while (current!== receiver) {
                path.push(property);
                current = current[property];
            }
            path = path.reverse();
            console.log(`属性路径: ${path.join('.')}, 新值: ${value}`);
            if (typeof value!== 'number') {
                throw new Error('新值必须为数字类型');
            }
            Reflect.set(target, property, value, receiver);
            return true;
        }
    });
}

// 使用示例
let obj = {a: {b: 1}};
let interceptedObj = deepDataInterceptor(obj);
interceptedObj.a.b = 2; 
// 输出: 属性路径: a.b, 新值: 2
try {
    interceptedObj.a.b = 'three'; 
} catch (error) {
    console.error(error.message); 
    // 输出: 新值必须为数字类型
}