Bagikan melalui


Objek Debugger Asli di Ekstensi JavaScript - Detail Objek Debugger

Topik ini menjelaskan detail tambahan tentang menggunakan objek debugger asli di ekstensi JavaScript.

Objek debugger asli mewakili berbagai konstruksi dan perilaku lingkungan debugger. Objek JavaScript dapat diteruskan ke ekstensi JavaScript (atau diperoleh dalam ekstensi) untuk memanipulasi status debugger.

Untuk informasi tentang ekstensi JavaScript objek Debugger, lihat Objek Debugger Asli di Ekstensi JavaScript.

Untuk informasi umum tentang bekerja dengan JavaScript, lihat Pembuatan Skrip JavaScript Debugger.

Misalnya skrip dan ekstensi JavaScript, tim debugger menghosting repositori GitHub di https://github.com/Microsoft/WinDbg-Samples.

Objek Debugger di Ekstensi JavaScript

Meneruskan Objek Asli

Objek debugger dapat diteruskan atau diperoleh dalam ekstensi JavaScript dengan berbagai cara.

  • Mereka dapat diteruskan ke fungsi atau metode JavaScript
  • Mereka dapat menjadi objek instans untuk prototipe JavaScript (sebagai visualizer, misalnya)
  • Mereka dapat dikembalikan dari metode host yang dirancang untuk membuat objek debugger asli
  • Mereka dapat dikembalikan dari metode host yang dirancang untuk membuat objek asli debugger

Objek debugger yang diteruskan ke ekstensi JavaScript memiliki serangkaian fungsionalitas yang dijelaskan di bagian ini.

  • Akses Properti
  • Nama yang Direncanakan
  • Jenis Khusus yang Berkaitan dengan Objek Debugger Asli
  • Atribut Tambahan

Akses Properti

Meskipun ada beberapa properti pada objek yang ditempatkan di sana oleh penyedia JavaScript itu sendiri, sebagian besar properti pada objek asli yang memasuki JavaScript disediakan oleh model data. Ini berarti bahwa untuk akses properti --- object.propertyName atau object[propertyName], hal berikut akan terjadi.

  • Jika propertyName adalah nama properti yang diproyeksikan ke objek oleh penyedia JavaScript itu sendiri, properti tersebut yang akan diprioritaskan terlebih dahulu; sebaliknya
  • Jika propertyName adalah nama kunci yang diproyeksikan ke objek oleh model data (Visualizer lain), itu akan diselesaikan dengan nama ini sebagai pilihan kedua; sebaliknya
  • Jika propertyName adalah nama bidang dari objek asli, maka properti tersebut akan menjadi pilihan ketiga dalam penyelesaian ke nama ini; sebaliknya
  • Jika objek adalah pointer, pointer akan didereferensikan, dan siklus di atas akan dilanjutkan (properti proyeksi dari objek yang didereferensi diikuti oleh kunci diikuti oleh bidang bawaan)

Cara normal akses properti di JavaScript -- object.propertyName dan object[propertyName] -- akan mengakses bidang asli objek yang mendasar, seperti perintah 'dx' dalam debugger.

Nama yang Diproyeksikan

Properti berikut (dan metode) diproyeksikan ke objek asli yang memasukkan JavaScript.

Metode Tanda tangan Deskripsi
hostContext Harta benda Mengembalikan objek yang mewakili konteks objek berada di dalam (ruang alamat, target debug, dll...)
targetLokasi Harta benda Mengembalikan objek yang merupakan abstraksi tempat objek berada dalam ruang alamat (alamat virtual, daftar, sub-daftar, dll...)
targetSize Harta benda Mengembalikan ukuran objek (secara efektif: sizeof(<TYPE OF OBJECT>)
addParentModel .addParentModel(object) Menambahkan model induk baru (mirip dengan prototipe JavaScript tetapi di sisi model data) ke objek
removeParentModel .removeParentModel(object) Menghapus model induk tertentu dari objek
runtimeTypedObject Harta benda Melakukan analisis pada objek dan mencoba mengonversinya ke jenis runtime (paling turunan)
targetType Harta benda Ekstensi JavaScript memiliki akses langsung ke sistem jenis bahasa yang mendasar. Akses ini dinyatakan melalui gagasan objek tipe. Untuk informasi selengkapnya, lihat Objek Debugger Asli di Ekstensi JavaScript - Ketik Objek

Jika objek adalah penunjuk, properti berikut (dan metode) diproyeksikan ke penunjuk yang memasukkan JavaScript:

Nama Properti Tanda tangan Deskripsi
tambahkan .add(value) Melakukan penambahan matematika penunjuk antara penunjuk dan nilai yang ditentukan
alamat Harta benda Mengembalikan alamat penunjuk sebagai objek ordinal 64-bit (jenis pustaka)
mengakses nilai referensi .dereference() Menghilangkan referensi dari pointer dan mengembalikan objek dasar
isNull Harta benda Mengembalikan apakah nilai penunjuk adalah nullptr (0) atau tidak

Jenis Khusus yang Berkaitan dengan Objek Debugger Asli

Objek Lokasi

Objek lokasi yang dikembalikan dari properti targetLocation dari objek asli berisi properti (dan metode) berikut.

Nama Properti Tanda tangan Deskripsi
tambahkan .add(value) Menambahkan offset byte absolut ke lokasi.
mengurangkan .subtract(value) Mengurangi jarak byte absolut dari lokasi.

Atribut Tambahan

Iterabilitas

Objek apa pun yang dipahami sebagai dapat diulang oleh model data (ini adalah array asli atau memiliki visualizer (NatVis atau sebaliknya) yang membuatnya dapat diulang) akan memiliki fungsi iterator (diindeks melalui Symbol.iterator standar ES6) yang ditempatkan di atasnya. Ini berarti Anda dapat mengulangi objek asli di JavaScript sebagai berikut.

function iterateNative(nativeObject)
{
    for (var val of nativeObject)
    {
        // 
        // val will contain each element iterated from the native object.  This would be each element of an array,
        // each element of an STL structure which is made iterable through NatVis, each element of a data structure
        // which has a JavaScript iterator accessible via [Symbol.iterator], or each element of something
        // which is made iterable via support of IIterableConcept in C/C++.
        //
    }
}

Pengindeksan

Objek yang dipahami sebagai dapat diindeks dalam satu dimensi melalui ordinal (misalnya: array asli) akan dapat diindeks di JavaScript melalui operator akses properti standar -- object[index]. Jika objek dapat diindeks berdasarkan nama atau dapat diindeks dalam lebih dari satu dimensi, metode getValueAt dan setValueAt akan diproyeksikan ke objek sehingga kode JavaScript dapat menggunakan pengindeks.

function indexNative(nativeArray)
{
    var first = nativeArray[0];
}

Konversi String

Setiap objek asli yang memiliki konversi string tampilan melalui dukungan IStringDisplayableConcept atau elemen NatVis DisplayString akan memiliki konversi string yang dapat diakses melalui metode JavaScript toString standar.

function stringifyNative(nativeObject)
{
    var myString = nativeObject.toString();
}

Membuat Objek Debugger Asli

Seperti disebutkan, skrip JavaScript bisa mendapatkan akses ke objek asli dengan memasukkannya ke JavaScript dengan salah satu dari beberapa cara atau dapat membuatnya melalui panggilan ke pustaka host. Gunakan fungsi berikut untuk membuat objek debugger asli.

Metode Tanda tangan Deskripsi

host.getModuleSymbol

getModuleSymbol(namaModul, namaSimbol, [pewarisKonteks])

getModuleSymbol(moduleName, symbolName, [typeName], [contextInheritor])

Mengembalikan objek untuk simbol global dalam modul tertentu. Nama modul dan nama simbol adalah string.

Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip pengujian satu kali harus selalu menyediakan konteks eksplisit.

Jika argumen opsional typeName diberikan, simbol akan diasumsikan sebagai tipe yang diberikan, dan tipe yang ditunjukkan dalam simbol akan diabaikan. Perhatikan bahwa setiap pemanggil yang mengharapkan untuk menggunakan simbol publik untuk modul harus selalu menyediakan nama jenis eksplisit.

host.getModuleContainingSymbol

getModuleContainingSymbol(location, [contextInheritor])

Mengembalikan simbol (misalnya: fungsi atau data) yang berisi alamat yang diberikan. Perhatikan bahwa ini hanya akan berfungsi jika ada simbol privat untuk modul yang berisi alamat yang diberikan.

Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip pengujian satu kali harus selalu menyediakan konteks eksplisit.

host.createPointerObject

createPointerObject(address, moduleName, typeName, [contextInheritor])

Membuat objek penunjuk di alamat atau lokasi yang ditentukan. Nama modul dan nama jenis adalah string.

Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip pengujian satu kali harus selalu menyediakan konteks eksplisit.

host.createTypedObject

createTypedObject(location, moduleName, typeName, [contextInheritor])

Membuat objek yang mewakili objek bertipe asli dalam ruang alamat memori target debug di lokasi yang ditentukan. Nama modul dan nama jenis adalah string.

Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip pengujian satu kali harus selalu menyediakan konteks eksplisit.

API Host untuk Ekstensi JavaScript

Penyedia JavaScript menyisipkan objek yang disebut host ke dalam namespace layanan global dari setiap skrip yang dimuatnya. Objek ini menyediakan akses ke fungsionalitas penting untuk skrip serta akses ke namespace debugger. Ini diatur dalam dua fase.

  • Fase 1: Sebelum skrip dijalankan, objek host hanya berisi serangkaian fungsionalitas minimal yang diperlukan agar skrip menginisialisasi dirinya sendiri dan mendaftarkan titik ekstensibilitasnya (baik sebagai produsen maupun konsumen). Kode akar dan inisialisasi tidak dimaksudkan untuk memanipulasi status target debug atau melakukan operasi kompleks dan, dengan demikian, host tidak sepenuhnya diisi sampai setelah metode initializeScript kembali.

  • Fase 2: Setelah inisialisasiScript kembali, objek host diisi dengan semua yang diperlukan untuk memanipulasi status target debug.

Tingkat Objek Host

Beberapa potongan kunci fungsionalitas berada tepat di bawah objek host. Sisanya diberi struktur sub-namespace. Namespace mencakup hal-hal berikut.

Namespace Deskripsi
diagnostik Fungsionalitas untuk membantu dalam diagnosis dan debug kode skrip
memori Fungsionalitas untuk mengaktifkan pembacaan dan penulisan memori dalam target debug

Tingkat Akar

Langsung dalam objek host, properti, metode, dan konstruktor berikut dapat ditemukan.

Nama Tanda tangan Fase Saat Ini Deskripsi
MembuatObjekPointer

createPointerObject(address, moduleName, typeName, [contextInheritor])

2 Membuat objek penunjuk di alamat atau lokasi yang ditentukan. Nama modul dan nama jenis adalah string. Argumen contextInheritor opsional berfungsi seperti halnya getModuleSymbol.
createTypedObject (membuat objek bertipe)

createTypedObject(location, moduleName, typeName, [contextInheritor])

2 Membuat sebuah objek yang mewakili objek tertipe asli pada lokasi yang ditentukan dalam ruang alamat dari target debug. Nama modul dan nama jenis adalah string. Argumen contextInheritor opsional berfungsi seperti halnya getModuleSymbol.
currentProcess

Harta benda

2 Mengembalikan objek yang mewakili proses debugger saat ini
sesiSaatIni

Harta benda

2 Mengembalikan objek yang mewakili sesi debugger saat ini (target, cadangan, dll...) yang sedang di-debug
currentThread

Harta benda

2 Mengembalikan objek yang mewakili thread debugger saat ini
evaluateExpression

evaluateExpression(expression, [contextInheritor])

2 Ini memanggil host debug untuk mengevaluasi ekspresi menggunakan bahasa target debug saja. Jika argumen contextInheritor opsional disediakan, ekspresi akan dievaluasi dalam konteks (misalnya: ruang alamat dan target debug) dari argumen; jika tidak, ini akan dievaluasi dalam konteks debugger saat ini
evaluateExpressionInContext

evaluateExpressionInContext(context, expression)

2 Ini memanggil host debug untuk mengevaluasi ekspresi menggunakan bahasa target debug saja. Argumen konteks menunjukkan implisit penunjuk ini untuk digunakan untuk evaluasi. Ekspresi akan dievaluasi dalam konteks (misalnya: ruang alamat dan target debug) yang ditunjukkan oleh argumen konteks .
getModuleSymbol

getModuleSymbol(moduleName, symbolName, [contextInheritor])

2 Mengembalikan objek untuk simbol global dalam modul tertentu. Nama modul dan nama simbol adalah string. Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip sekali pakai harus selalu menyediakan konteks eksplisit
getNamedModel

getNamedModel(modelName)

2 Mengembalikan model data yang didaftarkan terhadap nama tertentu. Perhatikan bahwa sepenuhnya legal untuk melakukan panggilan ini pada nama yang belum terdaftar. Melakukannya akan membuat stub untuk nama tersebut, dan manipulasi stub tersebut akan diterapkan pada objek aktual ketika pendaftaran.
nilaiDiindeks

indexedValue baru(nilai, indeks-indeks)

2 Konstruktor untuk objek yang dapat dikembalikan dari iterator JavaScript untuk menetapkan sekumpulan indeks default ke nilai yang diulang. Kumpulan indeks harus dinyatakan sebagai array JavaScript.
Int64

new Int64(nilai, [nilaiTinggi])

1 Ini membuat pustaka jenis Int64. Versi argumen tunggal akan mengambil nilai apa pun yang dapat dikemas ke dalam Int64 (tanpa konversi) dan menempatkannya ke dalamnya. Jika argumen kedua opsional disediakan, konversi argumen pertama dikemas ke dalam 32-bit yang lebih rendah dan konversi argumen kedua dikemas ke dalam 32 bit atas.
namedModelParent

baru bernamaModelParent(objek, nama)

1 Konstruktor untuk objek yang dimaksudkan untuk ditempatkan dalam array yang dikembalikan dari initializeScript, ini mewakili penggunaan prototipe JavaScript atau kelas ES6 sebagai ekstensi induk model data dari model data dengan nama tertentu
namedModelRegistration

baru bernamaModelRegistration(objek, nama)

1 Konstruktor untuk objek yang dimaksudkan untuk ditempatkan dalam array yang dikembalikan dari initializeScript, ini mewakili pendaftaran prototipe JavaScript atau kelas ES6 sebagai model data melalui nama yang diketahui sehingga ekstensi lain dapat menemukan dan memperluas
ruang nama

Harta benda

2 Memberikan akses langsung ke namespace root debugger. Misalnya, seseorang dapat mengakses daftar proses target debug pertama melalui host.namespace.Debugger.Sessions.First(). Proses menggunakan properti ini
registerNamedModel

registerNamedModel(object, modelName)

2 Ini mendaftarkan prototipe JavaScript atau kelas ES6 sebagai model data dengan nama yang diberikan. Pendaftaran semacam itu memungkinkan prototipe atau kelas ditemukan dan diperluas oleh skrip lain atau ekstensi debugger lainnya. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek namedModelRegistration dari metode initializeScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode inisialisasiScript untuk membersihkan.
registerExtensionForTypeSignature

registerExtensionForTypeSignature(object, typeSignature)

2 Ini mendaftarkan prototipe JavaScript atau kelas ES6 sebagai model data ekstensi untuk jenis asli sesuai dengan tanda tangan jenis yang diberikan. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek typeSignatureExtension dari metode inisialisasiScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode inisialisasiScript untuk membersihkan.
registerPrototypeForTypeSignature

registerPrototypeForTypeSignature(object, typeSignature)

2 Ini mendaftarkan prototipe JavaScript atau kelas ES6 sebagai model data kanonis (misalnya: visualizer) untuk tipe bawaan seperti yang diberikan oleh tanda tangan tipe yang disediakan. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek typeSignatureRegistration dari metode initializeScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode uninitializeScriptuntuk membersihkan.
parseInt64

parseInt64(string, [radix])

1 Metode ini bertindak mirip dengan metode javascript parseInt standar kecuali bahwa ia mengembalikan pustaka jenis Int64 sebagai gantinya. Jika radiks disediakan, penguraian akan terjadi pada basis 2, 8, 10, atau 16 seperti yang ditunjukkan.
tipeTandaTanganEkstensi

typeSignatureExtension baru(object, typeSignature, [moduleName], [minVersion], [maxVersion])

1 Konstruktor untuk objek yang dimaksudkan untuk dimasukkan dalam array yang dikembalikan dari initializeScript. Ini mewakili perluasan tipe asli yang dijelaskan melalui penanda tipe oleh prototipe JavaScript atau kelas ES6. Pendaftaran seperti itu "menambahkan bidang" pada visualisasi debugger untuk jenis apa pun yang cocok dengan tanda tangan, alih-alih mengambil alih sepenuhnya. Nama dan versi modul opsional dapat membatasi pendaftaran. Versi ditentukan sebagai string format "1.2.3.4".
Pendaftaran Tanda Tangan Tipe

typeSignatureRegistration baru(object, typeSignature, [moduleName], [minVersion], [maxVersion])

1 Konstruktor untuk objek yang ditujukan untuk ditempatkan dalam array yang dikembalikan dari initializeScript, ini mewakili pendaftaran resmi prototipe JavaScript atau kelas ES6 terhadap tanda tangan tipe native. Pendaftaran semacam itu "menguasai" visualisasi debugger dari tipe apa pun yang sesuai dengan tanda tangan daripada sekadar memperluasnya. Nama dan versi modul opsional dapat membatasi pendaftaran. Versi ditentukan dalam format string "1.2.3.4".
unregisterNamedModel (batalkan pendaftaranModelBernama)

unregisterNamedModel(modelName)

2 Ini membatalkan pendaftaran model data dari pencarian dengan nama yang diberikan, membalikkan operasi apa pun yang telah dilakukan oleh registerNamedModel
unregisterExtensionForTypeSignature

unregisterExtensionForTypeSignature(object, typeSignature, [moduleName], [minVersion], [maxVersion])

2 Ini membatalkan registrasi prototipe JavaScript atau kelas ES6 agar tidak menjadi model data ekstensi untuk tipe native sesuai dengan tanda tangan tipe yang diberikan. Ini adalah pembatalan logis dari fungsi registerExtensionForTypeSignature. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek typeSignatureExtension dari metode inisialisasiScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode inisialisasiScript untuk membersihkan. Nama dan versi modul opsional dapat membatasi pendaftaran. Versi ditentukan dalam format string "1.2.3.4".
unregisterPrototypeForTypeSignature

unregisterPrototypeForTypeSignature(object, typeSignature, [moduleName], [minVersion], [maxVersion])

2 Membatalkan pendaftaran prototipe JavaScript atau kelas ES6 dari menjadi model data kanonis (misalnya: visualizer) untuk tipe asli sebagaimana yang ditentukan oleh tanda tangan tipe yang disediakan. Ini adalah pembatalan logis dari registerPrototypeForTypeSignature. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek typeSignatureRegistration dari metode initializeScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode uninitializeScript untuk membersihkan. Nama dan versi modul opsional dapat membatasi pendaftaran. Versi ditentukan dalam format string "1.2.3.4".

Fungsionalitas Diagnostik

Sub-namespace layanan diagnostik objek host berisi yang berikut ini.

Nama Tanda tangan Fase Saat Ini Deskripsi
debugLog debugLog(objek...) 1 Ini menyediakan debugging gaya printf pada ekstensi skrip. Saat ini, output dari debugLog diarahkan ke konsol output debugger. Di kemudian hari, ada rencana untuk memberikan fleksibilitas dalam perutean output ini. CATATAN: Ini tidak boleh digunakan sebagai sarana pencetakan output pengguna ke konsol. Ini mungkin tidak dialihkan ke sana di masa depan.

Fungsionalitas Memori

Sub-namespace memori objek host berisi yang berikut ini.

Nama Tanda tangan Fase Saat Ini Deskripsi
readMemoryValues

bacaNilaiMemori(lokasi, jumlahElemen, [ukuranElemen], [bertanda], [pewarisKonteks])

2 Ini membaca array nilai mentah dari ruang alamat target debug dan menempatkan array yang ditik di atas tampilan memori ini. Lokasi yang disediakan dapat berupa alamat (nilai 64-bit), objek lokasi, atau pointer asli. Ukuran array ditunjukkan oleh argumen numElements . Ukuran (dan jenis) dari setiap elemen array diberikan oleh argumen opsional elementSize dan isSigned. Jika tidak ada argumen yang disediakan, defaultnya adalah byte (tidak ditandatangani / 1 byte). Jika argumen contextInheritor opsional disediakan, memori akan dibaca dalam konteks (misalnya: ruang alamat dan target debug) yang ditunjukkan oleh argumen; jika tidak, ini akan dibaca dari konteks debugger saat ini. Perhatikan bahwa menggunakan metode ini pada nilai 8, 16, dan 32-bit menghasilkan tampilan berjenis cepat yang ditempatkan di atas memori baca. Menggunakan metode ini pada nilai 64-bit menghasilkan array jenis pustaka 64-bit yang dibangun yang secara signifikan lebih mahal!
readString

readString(location, [contextInheritor])

bacaString(lokasi, [panjang], [pewarisKonteks])

2 Ini membaca string sempit (halaman kode saat ini) dari ruang alamat target debug, mengonversinya menjadi UTF-16, dan mengembalikan hasilnya sebagai string JavaScript. Ini dapat melemparkan pengecualian jika memori tidak dapat dibaca. Lokasi yang disediakan dapat berupa alamat (nilai 64-bit), objek lokasi, atau karakter asli. Jika argumen contextInheritor opsional disediakan, memori akan dibaca dalam konteks (misalnya: ruang alamat dan target debug) yang ditunjukkan oleh argumen; jika tidak, ini akan dibaca dari konteks debugger saat ini. Jika argumen panjang opsional disediakan, string baca akan memiliki panjang yang ditentukan.
readWideString

readWideString(lokasi, [contextInheritor])

readWideString(location, [length], [contextInheritor])

2 Ini membaca string wide(UTF-16) dari ruang alamat target debug dan mengembalikan hasilnya sebagai string JavaScript. Ini dapat melemparkan pengecualian jika memori tidak dapat dibaca. Lokasi yang disediakan dapat berupa alamat (nilai 64-bit), objek lokasi, atau wchar_t asli. Jika argumen contextInheritor opsional disediakan, memori akan dibaca dalam konteks (misalnya: ruang alamat dan target debug) yang ditunjukkan oleh argumen; jika tidak, ini akan dibaca dari konteks debugger saat ini. Jika argumen panjang opsional disediakan, string baca akan memiliki panjang yang ditentukan.

Konsep Model Data di JavaScript

Pemetaan Model Data

Konsep-konsep model data berikut dipetakan ke JavaScript.

Konsep Antarmuka Asli Padanan JavaScript
Konversi String IStringDisplayableConcept standar: toString(...){...}
Iterabilitas IIterableConcept standar: [Symbol.iterator](){...}
Kemampuan Pengindeksan IIndexableConcept protokol: getDimensionality(...) / getValueAt(...) / setValueAt(...)
Konversi Jenis Runtime IPreferredRuntimeTypeConcept protokol: getPreferredRuntimeTypedObject(...)

Konversi String

Konsep konversi string (IStringDisplayableConcept) secara langsung diterjemahkan ke metode JavaScript toString standar. Karena semua objek JavaScript memiliki konversi string (disediakan oleh Object.prototype jika tidak disediakan di tempat lain), setiap objek JavaScript yang dikembalikan ke model data dapat dikonversi ke string tampilan. Mengesampingkan konversi string hanya memerlukan penerapan toString Anda sendiri.

class myObject
{
    //
    // This method will be called whenever any native code calls IStringDisplayableConcept::ToDisplayString(...)
    //
    toString()
    { 
        return "This is my own string conversion!";
    }
}

Iterabilitas

Konsep model data tentang apakah suatu objek bersifat iterable atau tidak sesuai langsung dengan protokol ES6 tentang apakah objek tersebut dapat diiterasi. Objek apa pun yang memiliki metode [Symbol.iterator] dianggap dapat diulang. Implementasi tersebut akan membuat objek dapat diulang.

Objek yang hanya dapat diulang dapat memiliki implementasi seperti berikut.

class myObject
{
    //
    // This method will be called whenever any native code calls IIterableConcept::GetIterator
    //
    *[Symbol.iterator]()
    {
        yield "First Value";
        yield "Second Value";
        yield "Third Value";
    }
}

Pertimbangan khusus harus diberikan untuk objek yang dapat diulang dan dapat diindeks karena objek yang dikembalikan dari iterator harus menyertakan indeks serta nilai melalui jenis pengembalian khusus.

Iterable dan Indexable

Objek yang dapat diulang dan dapat diindeks memerlukan nilai pengembalian khusus dari iterator. Alih-alih menghasilkan nilai, iterator menghasilkan instance dari indexedValue. Indeks diteruskan sebagai array dalam argumen kedua ke konstruktor indexedValue. Mereka bisa multi-dimensi tetapi harus cocok dengan dimensi yang dikembalikan dalam protokol pengindeks.

Kode ini menunjukkan contoh implementasi.

class myObject
{
    //
    // This method will be called whenever any native code calls IIterableConcept::GetIterator
    //
    *[Symbol.iterator]()
    {
        //
        // Consider this a map which mapped 42->"First Value", 99->"Second Value", and 107->"Third Value"
        //
        yield new host.indexedValue("First Value", [42]);
        yield new host.indexedValue("Second Value", [99]);
        yield new host.indexedValue("Third Value", [107]);
    }
}

Pengindeksan

Tidak seperti JavaScript, model data membuat diferensiasi yang sangat eksplisit antara akses properti dan pengindeksan. Setiap objek JavaScript yang ingin menampilkan dirinya sebagai dapat diindeks dalam model data harus menerapkan protokol yang terdiri dari metode getDimensionality yang mengembalikan dimensi pengindeks dan sepasang opsional metode getValueAt dan setValueAt yang melakukan pembacaan dan penulisan objek pada indeks yang disediakan. Dapat diterima untuk menghilangkan metode getValueAt atau setValueAt apabila objek tersebut hanya dapat dibaca atau ditulis saja.

class myObject
{
    //
    // This method will be called whenever any native code calls IIndexableConcept::GetDimensionality or IIterableConcept::GetDefaultIndexDimensionality
    //
    getDimensionality()
    {
        //
        // Pretend we are a two dimensional array.
        //
        return 2;
    } 

    //
    // This method will be called whenever any native code calls IIndexableConcept::GetAt
    //
    getValueAt(row, column)
    {
        return this.__values[row * this.__columnCount + column];
    }

    //
    // This method will be called whenever any native code calls IIndexableConcept::SetAt
    //
    setValueAt(value, row, column)
    {
        this.__values[row * this.__columnCount + column] = value;
    }
}

Konversi Jenis Runtime

Ini hanya relevan untuk prototipe/kelas JavaScript yang terdaftar terhadap jenis sistem jenis (asli). Debugger sering mampu melakukan analisis (misalnya Run-Time Type Information (RTTI) / v-table analysis) untuk menentukan jenis runtime sejati objek dari jenis statis yang dinyatakan dalam kode. Model data yang terdaftar terhadap tipe bawaan dapat menggantikan perilaku ini melalui implementasi IPreferredRuntimeTypeConcept. Demikian juga, kelas JavaScript atau prototipe yang terdaftar pada objek asli dapat memberikan implementasinya sendiri melalui implementasi protokol yang terdiri dari metode getPreferredRuntimeTypedObject.

Perhatikan bahwa meskipun metode ini secara teknis dapat mengembalikan apa pun, dianggap tidak baik untuk metode ini mengembalikan sesuatu yang bukan merupakan jenis runtime yang sebenarnya atau jenis yang diturunkan. Hal tersebut dapat mengakibatkan kebingungan yang signifikan bagi pengguna debugger. Namun, mengesampingkan metode ini dapat bernilai untuk hal-hal seperti implementasi dengan gaya header dan objek ala C, dll...

class myNativeModel
{
    //
    // This method will be called whenever the data model calls IPreferredRuntimeTypeConcept::CastToPreferredRuntimeType
    //
    getPreferredRuntimeTypedObject()
    {
        var loc = this.targetLocation;

        //
        // Perform analysis...
        //
        var runtimeLoc = loc.Add(runtimeObjectOffset);
  
        return host.createTypedObject(runtimeLoc, runtimeModule, runtimeTypeName);
    }
}

Lihat juga

Objek Debugger Asli di ekstensi JavaScript

Objek Debugger Asli di Ekstensi JavaScript - Pertimbangan Desain dan Pengujian

Pemrograman Debugger JavaScript

Contoh Skrip JavaScript Debugger