首页 > 解决方案 > 如何将对象包装在代理中以进行调试?

问题描述

我正在尝试包装一个对象以识别谁在更改它。我试图用Proxy对象做到这一点,但我得到了一个奇怪的错误:

const wrap = object => {
    const handler = {
        get(obj, prop) {
            return wrap(obj[prop])            
        },
        set(obj, prop, value) {
            debugger;
            return Reflect.set(obj, prop, value)
        }
    };
    return new Proxy(object, handler)
}

我运行obj = wrap(obj),然后启动我的函数,但随后引发错误:

TypeError: Cannot create proxy with a non-object as target or handler

我究竟做错了什么?

标签: javascriptecmascript-6proxy

解决方案


如果 的属性obj不是对象,则递归包装将不起作用。检查 obj 是否为对象:

const wrap = object => {
    const handler = {
        get(obj, prop) {
            return wrap(obj[prop])            
        },
        set(obj, prop, value) {
            debugger;
            return Reflect.set(obj, prop, value)
        }
    };
    return _.isObject(object) ? new Proxy(object, handler) : object
}

推荐阅读