簡體   English   中英

Javascript ES6代理

[英]Javascript ES6 Proxy

我需要創建一個存儲其他對象的對象。 大對象的每個屬性都有兩個屬性“值”和“回調”。

let bigObj = {
    first: {
        value: true,
        callback: () => {}
    },
    second: {
        value: false,
        callback: () => {}
    }, {...}
}

我希望能夠通過使用bigObj.first / bigObj.first =“ false”,並通過經典方法回調來獲取和更改value屬性:bigObj.first.callback =()=> {}。

每次更改屬性“值”時,我都想調用其回調函數。

這就是我所做的

var proxy = new Proxy({
    first: {
        value: true,
        callback: () => {}
    }
}, {
    get(target, key) {
        return key in target ? target[key].value : null;
    },
    set(target, key, value) {
        target[key] ? target[key].value = value : target[key] = {value, callback: () => {}};
        key !== 'callback' && target[key].callback();
        return true;
    }
});

問題是我無法更改回調屬性。

proxy.first.callback = () => console.log('new cb'); // won't do anything.

您對我如何更改代碼有任何想法嗎?

謝謝。

您的設置方式是proxy.first返回一個布爾值。 因此, proxy.first.callback =最終為false.callback =true.callback = 這些至少不會引發異常,但是它們沒有用。 如果值是對象而不是布爾值,則可以使值本身成為代理,但不能創建以非對象為目標的代理。

另一個選擇是先設置一個特殊值,然后告訴它插入回調。 下面是一個示例,如果您傳入{callback:()=> {}}之類的對象,則會將其插入為回調。 但是其他任何東西都將被設置為值。

 var proxy = new Proxy({ first: { value: true, callback: () => {} } }, { get(target, key) { return key in target ? target[key].value : null; }, set(target, key, value) { if (value && value.callback) { target[key] ? target[key].callback = value.callback : target[key] = {value: null, callback: value.callback}; return true; } else { target[key] ? target[key].value = value : target[key] = {value, callback: () => {}}; target[key].callback(); return true; } } }); proxy.first = {callback: () => console.log('got a callback')}; proxy.first = false; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM