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: (target, prop, newValue) => { target[prop] = newValue callback() } } ) } const state = watch( { name: 'matt', friend: { name: 'bob' } }, () => { console.log(state); } ) //state.name = 'Matthew' state.friend.name = 'Bilbo' state.name = 'Matthew'