Dalam pekerjaan pengembangan saya, saya sering menghadapi situasi di mana saya perlu menentukan apakah suatu fungsi adalah fungsi asli JavaScript. Terkadang ini adalah tugas yang sangat penting. Anda perlu tahu apakah fungsi ini disediakan oleh browser itu sendiri, atau dienkapsulasi dan disamarkan sebagai fungsi asli oleh pihak ketiga. Tentu saja, cara terbaik adalah dengan memeriksa nilai pengembalian metode ToString yang menjalankan fungsi ini.
JavaScript
Cara untuk menyelesaikan tugas ini sangat sederhana:
Salinan kode adalah sebagai berikut:
fungsi isnative (fn) {
return (// {/s*/[kode asli/]/s*/}/). test ('' + fn);
}
Metode ToString akan mengembalikan bentuk string dari metode ini, dan kemudian menggunakan ekspresi reguler untuk menentukan karakter yang terkandung di dalamnya.
Metode yang lebih kuat
John-David Dalton, pendiri LoDash, menemukan solusi yang lebih baik:
Salinan kode adalah sebagai berikut:
;(fungsi() {
// Digunakan untuk menyelesaikan `[[kelas]]` dari nilai internal
var tostring = object.prototype.tostring;
// digunakan untuk menyelesaikan sumber fungsi yang didekompilasi
var fntostring = function.prototype.toString;
// Digunakan untuk mendeteksi konstruktor host (safari> 4; benar -benar diketik spesifik)
var rehostctor =/^/[objek.+? Konstruktor/] $/;
// Kompilasi regexp menggunakan metode asli yang umum sebagai templat.
// Kami memilih `objek#tostring` karena ada peluang bagus yang tidak dikotori.
var renative = regexp ('^' +
// coerce `objek#tostring` ke string
String (tostring)
// Lepas Karakter Regexp Khusus
.replace (/[.*+?^$ {} () | [/] ////]/g, '// $ &')
// ganti menyebutkan `tostring` dengan`.*? `Untuk menjaga template generik.
// ganti hal seperti `untuk ...` untuk mendukung lingkungan seperti Rhino yang menambahkan info tambahan
// seperti metode arity.
.replace (/tostring | (fungsi).*? (? = /// () | for. +? (? = ///])/g, '$ 1.*?') + '$'
);
fungsi isnative (value) {
var type = TipeOf nilai;
tipe pengembalian == 'fungsi'
// Gunakan `function#tostring` untuk mem -bypass metode` tostring` nilai sendiri
// dan hindari dipalsukan.
? renative.test (fntostring.call (nilai))
// mundur ke pemeriksaan objek host karena beberapa lingkungan akan mewakili
// hal -hal seperti array yang diketik sebagai metode DOM yang mungkin tidak sesuai dengan
// Pola asli normal.
: (value && type == 'objek' && rehostctor.test (tostring.call (value))) || PALSU;
}
// Ekspor sesuka Anda
module.Exports = isnative;
} ());
Sekarang Anda melihatnya juga, ini sangat kompleks, tetapi lebih kuat. Tentu saja, ini bukan untuk perlindungan keamanan, itu hanya memberi Anda informasi yang relevan tentang apakah itu fungsi asli.