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 if(Array.isArray(target) && prop === 'length'){ return true } callback() return true } } ) } const state = watch( { name: 'matt', friend: { name: 'bob' }, stuff: ['bag', 123, true] }, () => { console.log(state); } ) console.log(state); state.name = 'Matthew' state.friend.name = 'Bilbo' state.stuff[0] = 'fun' state.stuff.push('weeee')