2017-08-31 35 views
1

如何在嵌套對象中處理ownKeys的所有陷阱?Proxy - handler.ownKeys() - 嵌套對象

我只知道如何處理一個級別深度對象:

function wrap(obj, fn) { 
    var handler = { 
    ownKeys(target) { 
     fn(target) 
     return target 
    } 
    } 
    return new Proxy(obj, handler) 
} 

var origObj = { 
    a: { 
    b: { 
    c: 0 
    } 
    } 
} 

var wrappedObj = wrap(origObj, console.log) 

Object.keys(wrappedObj) // => actual = expected: { a: { b: { c: 0 } } } 
Object.keys(wrappedObj.a) // => actual: not working, expected: { b: { c: 0 } } 
Object.keys(wrappedObj.a.b) // => actual: not working, expected: { c: 0 } 

編輯1:

如果我試圖包裝每個內部對象(從這個answer),那麼它會記錄所有步驟不只是最後一個。通過「所有步驟」,我的意思是代理的內部過程貫穿整個嵌套對象,因此它多次觸發fn(target),但我只想觸發一次。

Output in the console

編輯2:

所以看起來,這個問題是與節點environmnent(節點版本8.1.4),其中proxy看起來壞了。在Chrome控制檯中一切正常。

+1

只有'origObj'被代理,內部對象不是。 –

+0

是的,我知道這就是爲什麼我問我該怎麼做嵌套對象(我的英語爲sry)。 –

+0

如果您不想以遞歸方式創建代理,則需要遍歷代理內的'target'。 – ftor

回答

1

你要創建的對象的每一個代理:

var wrappedObj = wrap({ 
    a: wrap({ 
    b: wrap({ 
    c: 0 
    }, console.log) 
    }, console.log) 
}, console.log) 

如果你不想這樣做明確,當然你也可以使用遞歸以編程方式做包裝也遍歷對象,或者您通過get陷阱動態地在每次訪問屬性時創建代理。

+0

這不起作用,因爲它記錄的不僅僅是最後一個步驟。 –

+0

@MatejMazur你是什麼意思的「只是最後一個」?我以爲你想要三個'Object.keys'調用中的每一個來觸發日誌。 – Bergi

+0

我用控制檯的屏幕截圖更新了我的問題,它顯示輸出。 –