Dalam kerja pembangunan saya, saya sering menghadapi situasi di mana saya perlu menentukan sama ada fungsi adalah fungsi asli JavaScript Kadang-kadang ini adalah tugas yang sangat diperlukan Anda perlu mengetahui sama ada fungsi itu disediakan oleh penyemak imbas itu sendiri atau oleh a pihak ketiga. Enkapsulasi tiga pihak dan menyamar sebagai fungsi asli. Sudah tentu, cara terbaik adalah untuk memeriksa nilai pulangan kaedah toString yang melaksanakan fungsi ini.
JavaScript
Cara untuk menyelesaikan tugasan ini sangat mudah:
Kaedah yang lebih berkuasa
Pengasas Lodash John-David Dalton menemui penyelesaian yang lebih baik:
// Digunakan untuk menyelesaikan `[[Kelas]]` nilai dalaman
var toString = Object.prototype.toString;
// Digunakan untuk menyelesaikan sumber dekompilasi fungsi
var fnToString = Function.prototype.toString;
// Digunakan untuk mengesan pembina hos (Safari > 4; benar-benar menaip tatasusunan khusus)
var reHostCtor = /^[objek ?Pembina]$/;
// Susun regexp menggunakan kaedah asli biasa sebagai templat.
// Kami memilih `Object#toString` kerana ada kemungkinan besar ia tidak dicemari.
var reNative = RegExp('^'
// Paksa `Object#toString` pada rentetan
Rentetan(kepadaString)
// Melarikan diri daripada mana-mana aksara regexp istimewa
.ganti(/[.* ?^${}()|[]/\]/g, '\$&')
// Gantikan sebutan `toString` dengan `.*?` untuk mengekalkan templat generik.
// Gantikan perkara seperti `untuk ...` untuk menyokong persekitaran seperti Rhino yang menambahkan maklumat tambahan
// seperti kaedah arity.
.replace(/toString|(function).*?(?=\()| untuk . ?(?=\])/g, '$1.*?') '$'
);
fungsi ialahNative(value) {
jenis var = jenis nilai;
Jenis kembali == 'fungsi'
// Gunakan `Function#toString` untuk memintas kaedah `toString` nilai itu sendiri
// dan elakkan daripada dipalsukan.
? reNative.test(fnToString.call(value))
// Fallback kepada semakan objek hos kerana sesetengah persekitaran akan mewakili
// perkara seperti tatasusunan ditaip sebagai kaedah DOM yang mungkin tidak mematuhi
// corak asli biasa.
: (nilai && taip == 'objek' && reHostCtor.test(toString.call(value))) || false;
}
// eksport walau bagaimanapun anda mahu
module.exports = isNative;
}());