Firebug untuk Firefox memiliki fitur yang bagus, yang disebut "Break on property change", di mana saya dapat menandai properti apa pun dari objek apa pun, dan itu akan menghentikan eksekusi JavaScript tepat sebelum perubahan.
Saya mencoba mencapai hal yang sama di Google Chrome, dan saya tidak dapat menemukan fungsinya di debugger Chrome. Bagaimana saya melakukan ini di Google Chrome?
javascript
debugging
firefox
google-chrome
firebug
Arsen Zahray
sumber
sumber
Jawaban:
Jika Anda tidak keberatan bermain-main dengan sumbernya, Anda dapat mendefinisikan ulang properti dengan pengakses.
sumber
console.watch(obj, 'someProp')
.window.location
untuk alasan keamanan.obj._someProp = obj.someProp;
, sepertinya tidak berhubungan dengan apa yang Anda coba arsipkan (mungkin karena saya kehilangan sesuatu)Edit 2016.03:
Object.observe
sudah usang dan dihapus di Chrome 50Edit 2014.05:Object.observe
telah ditambahkan di Chrome 36Chrome 36 dikirimkan dengan
Object.observe
implementasi asli yang dapat dimanfaatkan di sini:Jika Anda menginginkannya hanya sementara, Anda harus menyimpan panggilan balik dalam suatu variabel dan menelepon
Object.unobserve
ketika selesai:Perhatikan bahwa saat menggunakan
Object.observe
, Anda tidak akan diberitahu ketika tugas tidak mengubah apa pun, misalnya jika Anda telah menulismyObj.a = 1
.Untuk melihat tumpukan panggilan, Anda harus mengaktifkan opsi "tumpukan panggilan async" di Dev Tools:
Jawaban asli (2012.07):
Sebuah
console.watch
sketsa seperti yang disarankan oleh @katspaugh:Doa:
Kesesuaian:
debugger
(atau apakah ini masalah konfigurasi? tolong perbaiki saya), tetapiconsole.log
berfungsi.Edit:
Perhatikan bahwa di Firefox,
console.watch
sudah ada, karena Firefox tidak standarObject.watch
. Karenanya di Firefox, Anda dapat melihat perubahan secara asli:Namun, ini akan segera (akhir 2017) dihapus .
sumber
oObj[sProp]
, karena rajin akan memasuki rekursi yang tak terbatas. Cobalah di Chrome, Anda akan mendapatkannyaRangeError: Maximum call stack size exceeded
.async
kotak centangnya sangat emas dengan pendekatan ini: html5rocks.com/en/tutorials/developertools/async-call-stackasync
kotak centang seperti @cnp menulis, lihat pembaruan sayaObject.observe
sudah usang dan akan segera dihapus: lihat: chromestatus.com/features/6147094632988672Ada perpustakaan untuk ini: BreakOn ()
Jika Anda menambahkannya ke alat dev Chrome sebagai cuplikan (sumber -> cuplikan -> klik kanan -> baru -> rekatkan ini ) , Anda dapat menggunakannya kapan saja.
Untuk menggunakannya, buka dev-tools dan jalankan snippet. Kemudian untuk memecah ketika
myObject.myProperty
diubah, panggil ini dari dev-console:Anda juga bisa menambahkan pustaka ke debug-build proyek Anda sehingga Anda tidak perlu menelepon
breakOn
lagi setiap kali Anda menyegarkan halaman.sumber
Ini juga dapat dilakukan dengan menggunakan objek Proxy baru yang tujuannya persis seperti itu: mencegat membaca dan menulis ke objek yang dibungkus oleh Proxy. Anda cukup membungkus objek yang ingin Anda amati menjadi Proxy dan menggunakan objek yang dibungkus baru, bukan yang asli.
Contoh:
Sekarang gunakan wrapObject di mana Anda akan menyediakan originalObject sebagai gantinya dan memeriksa tumpukan panggilan saat istirahat.
sumber
set
harus kembalitrue
agar tidak gagal untuk kasus selain yang terlacak.sumber
Memutuskan untuk menulis versi saya sendiri dari solusi ini, simpan dalam potongan di DevTools Chrome, dan bungkus dalam IIFE yang seharusnya mendukung Node dan Browser. Juga mengubah pengamat untuk menggunakan variabel lingkup daripada properti pada objek, sehingga tidak ada kemungkinan bentrokan nama, dan kode apa pun yang menyebutkan kunci tidak akan "melihat" "kunci pribadi" baru yang dibuat:
sumber
Chrome memiliki fitur bawaan versi terbaru https://developers.google.com/web/updates/2015/05/05/view-and-change-your-dom-breakpoints .
Jadi tidak ada lagi kebutuhan untuk pustaka dan solusi kustom, cukup klik kanan pada elemen DOM di inspektur dan pilih 'Hancurkan' -> 'modifikasi atribut' dan hanya itu.
sumber