Saya selalu menghadapi situasi di mana saya perlu memeriksa apakah suatu fungsi adalah kode asli-ini adalah konten yang sangat penting dalam pengujian fungsional: adalah fungsi yang didukung oleh browser built-in atau disimulasikan melalui pustaka kelas pihak ketiga. Untuk mendeteksi ini, cara termudah tentu saja adalah menilai nilai yang dikembalikan dengan metode fungsi tostring.
Kode JavaScript
Sebenarnya cukup mudah untuk menentukan apakah suatu fungsi asli:
// Tentukan apakah fungsi fungsi asli isnative (fn) {// contoh: // alert.toString () // "function alert () {[kode asli]}" // '' + fn menggunakan konversi tipe implisit JS. return (// {/s*/[kode asli/]/s*/}/). test ('' + fn); }Konversi fungsi menjadi representasi string dan lakukan pencocokan reguler, ini adalah prinsip implementasi.
Versi yang ditingkatkan, perbarui!
; (function () {// Dapatkan metode objek tostring, digunakan untuk memproses internal (internal) dari nilai yang dilewati dalam parameter `[[class]]` var tostring = objek.prototype.tostring; // dapatkan metode tostring dari fungsi primitif, yang digunakan untuk menangani kode dekompilasi dari functions varial fntostring = fungsi host. (Host Constructors), // (Safari> 4; benar -benar output spesifik array) var rehostctor =/^/[objek. +? Konstruktor/] $ //; String (ToString) // Escape semua karakter khusus yang terkait dengan ekspresi reguler. parameter metode ini. .replace (/tostring | (fungsi).*? (? = /// () | for. +? (? = ///])/g, '$ 1.*?') // endword + '$'); fungsi isnative (value) {// juri tipe tipe var tipe = typeof nilai; type return == 'function' // Gunakan `fungsi#tostring` metode asli untuk menelepon, // alih -alih nilai metode` tostring` Anda sendiri, // untuk menghindari tertipu oleh pemalsuan. ? renative.test (fntostring.call (value)) // Jika tipe bukan 'fungsi', // Anda perlu memeriksa objek host (objek host), // karena beberapa lingkungan (browser) akan memperlakukan array yang diketik sebagai metode dom // pada saat ini, pola reguler asli mungkin tidak dicocokkan: (value && type == 'objek' && rehost. PALSU; }; // Anda dapat menetapkan isnative untuk variabel/objek yang Anda inginkan window.isnative = isnative; } ());Kode Uji:
isnative (isnative) // false isnative (waspada) // true window.isnative (window.isnative) // false window.isnative (window.alert) // true window.isnative (string.tostring) // true