Me encontré con un código cableado cuando estaba aprendiendo el seguimiento de dependencias de Vue:
function convert(obj) { Object.keys(obj).forEach(key => { let internalValue = obj[key] Object.defineProperty(obj, key, { get() { console.log(`getting key "${key}": ${internalValue}`) return internalValue }, set(newValue) { console.log(`setting key "${key}" to: ${newValue}`) internalValue = newValue console.log(obj); } }) }) return obj } // test let o = {a: 'hello',b:'world'}; let convO = convert(o); convO.b = 'javascript'; // in normal condition, change a pointer won't change the target: let p = o['b']; p = 'woola' console.log('normal condition', o);
Dentro de la función de devolución de llamada forEach
, primero definimos una variable internalValue
como un puntero, que apunta a obj[key]
. En segundo lugar, cambiamos ese puntero. ¿Por qué el objetivo puntiagudo está mutado? No tiene ningún sentido.