Firebug para Firefox tiene una característica agradable, llamada "Interrupción en el cambio de propiedad", donde puedo marcar cualquier propiedad de cualquier objeto, y detendrá la ejecución de JavaScript justo antes del cambio.
Estoy tratando de lograr lo mismo en Google Chrome, y no puedo encontrar la función en el depurador de Chrome. ¿Cómo hago esto en Google Chrome?
javascript
debugging
firefox
google-chrome
firebug
Arsen Zahray
fuente
fuente
Respuestas:
Si no te importa jugar con la fuente, puedes redefinir la propiedad con un descriptor de acceso.
fuente
console.watch(obj, 'someProp')
.window.location
por razones de seguridad.obj._someProp = obj.someProp;
Parece no tener relación con lo que está tratando de archivar (probablemente porque me falta algo)Editar 2016.03:
Object.observe
está en desuso y se elimina en Chrome 50Editar 2014.05:Object.observe
se agregó en Chrome 36Chrome 36 se entrega con
Object.observe
implementación nativa que se puede aprovechar aquí:Si lo desea solo temporalmente, debe almacenar la devolución de llamada en una variable y llamar
Object.unobserve
cuando haya terminado:Tenga en cuenta que cuando lo use
Object.observe
, no se le notificará cuando la tarea no haya cambiado nada, por ejemplo, si ha escritomyObj.a = 1
.Para ver la pila de llamadas, debe habilitar la opción "pila de llamadas asíncronas" en Dev Tools:
Respuesta original (2012.07):
Un
console.watch
boceto sugerido por @katspaugh:Invocación:
Compatibilidad:
debugger
(¿o es una cuestión de configuración? Corríjame entonces), peroconsole.log
funciona.Editar:
Tenga en cuenta que en Firefox,
console.watch
ya existe, debido al no estándar de FirefoxObject.watch
. Por lo tanto, en Firefox, puede observar los cambios de forma nativa:Sin embargo, esto se eliminará pronto (a fines de 2017) .
fuente
oObj[sProp]
porque el captador entraría en una recursión infinita. Pruébalo en Chrome, lo obtendrásRangeError: Maximum call stack size exceeded
.async
casilla de verificación es tan dorada con este enfoque: html5rocks.com/en/tutorials/developertools/async-call-stackasync
casilla de verificación como @cnp escribió, vea mi actualizaciónObject.observe
está en desuso y pronto se eliminará: consulte: chromestatus.com/features/6147094632988672Hay una biblioteca para esto: BreakOn ()
Si lo agrega a las herramientas de desarrollo de Chrome como un fragmento (fuentes -> fragmentos -> clic derecho -> nuevo -> pegar esto ) , puede usarlo en cualquier momento.
Para usarlo, abra las herramientas de desarrollo y ejecute el fragmento. Luego, para romper cuando
myObject.myProperty
se cambia, llame a esto desde la consola de desarrollo:También puede agregar la biblioteca a la compilación de depuración de su proyecto para no tener que volver a llamar
breakOn
cada vez que actualice la página.fuente
Esto también se puede hacer utilizando el nuevo objeto Proxy cuyo propósito es exactamente eso: interceptar las lecturas y escrituras en el objeto envuelto por el Proxy. Simplemente envuelva el objeto que desea observar en un Proxy y use el nuevo objeto envuelto en lugar del original.
Ejemplo:
Ahora use wrapObject donde proporcionaría originalObject en su lugar y examine la pila de llamadas en el descanso.
fuente
set
debe regresartrue
para que no falle por otros casos que no sean rastreados.fuente
Decidí escribir mi propia versión de esta solución, guardarla en un fragmento en DevTools de Chrome y envolverla en un IIFE que debería admitir tanto Node como Navegadores. También cambió el observador para usar una variable de alcance en lugar de una propiedad en el objeto, de modo que no haya posibilidad de conflictos de nombres, y cualquier código que enumere claves no "verá" la nueva "clave privada" que se crea:
fuente
Chrome tiene esta característica incorporada en las últimas versiones https://developers.google.com/web/updates/2015/05/view-and-change-your-dom-breakpoints .
Por lo tanto, no necesita más bibliotecas y soluciones personalizadas, simplemente haga clic con el botón derecho en el elemento DOM en el inspector y elija 'Romper' -> 'modificaciones de atributos' y listo.
fuente