const watch = (target, callback)=>{ for(const key in target){ if(typeof target[key] === 'object'){ target[key] = watch(target[key], callback) } } return new Proxy(target, { set: callback }) } const state = watch( { name: 'matt', friend: { name: 'bob' } }, (target, prop, newValue) => { console.log(newValue); } ) //state.name = 'Matthew' state.friend.name = 'Bilbo'