【问题标题】:How to define deleter similar to getter and setter如何定义类似于getter和setter的deleter
【发布时间】:2021-10-06 04:30:27
【问题描述】:

我有一个使用代理为嵌套对象设置的代码。我也想处理删除。我不知道该怎么做。

在下面的代码中,我使用代理来定义 getter 和 setter,但我也想在属性被删除时点击。

/*
    This function takes an object and converts to a proxy object.
    It also takes care of proxying nested objectsa and array.
*/
let getProxy = (original) => {
    return new Proxy(original, {
        get(target, name, receiver) {
            let rv = Reflect.get(target, name, receiver);
            return rv;
        },
        set(target, name, value, receiver) {
            // Proxies new objects 
            if(typeof value === "object"){
                value = getProxy(value);
            }
            return Reflect.set(target, name, value, receiver);
        }
    })
}

let first = {};
let proxy = getProxy(first);

/*
    Here are the tests
*/

proxy.name={}                               // object
proxy.name.first={}                         // nested object
proxy.name.first.names=[]                   // nested array 
proxy.name.first.names[0]={first:"vetri"}   // nested array with an object

/*
    Here are the serialised values
*/
console.log(JSON.stringify(first))  // {"name":{"first":{"names":[{"first":"vetri"}]}}}
console.log(JSON.stringify(proxy))  // {"name":{"first":{"names":[{"first":"vetri"}]}}}

【问题讨论】:

    标签: javascript proxy metaprogramming


    【解决方案1】:

    发现 deleteProperty 处理程序会处理它

    /*
        This function takes an object and converts to a proxy object.
        It also takes care of proxying nested objectsa and array.
    */
    let getProxy = (original) => {
        return new Proxy(original, {
            get(target, name, receiver) {
                let rv = Reflect.get(target, name, receiver);
                return rv;
            },
            set(target, name, value, receiver) {
                // Proxies new objects 
                if(typeof value === "object"){
                    value = getProxy(value);
                }
                return Reflect.set(target, name, value, receiver);
            },
            deleteProperty: function(target, property) {
                if (property in target) {
                    delete target[property];
                }
            }
        })
    }
    
    let first = {};
    let proxy = getProxy(first);
    
    /*
        Here are the tests
    */
    
    proxy.name={}                               // object
    proxy.name.first={}                         // nested object
    proxy.name.first.names=[]                   // nested array 
    proxy.name.first.names[0]={first:"vetri"}   // nested array with an object
    
    /*
        Here are the serialised values
    */
    console.log(JSON.stringify(first))  // {"name":{"first":{"names":[{"first":"vetri"}]}}}
    console.log(JSON.stringify(proxy))  // {"name":{"first":{"names":[{"first":"vetri"}]}}}
    delete proxy.name.first.names[0].first // call goes through the delete handler
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 2015-01-20
      • 2012-03-12
      相关资源
      最近更新 更多