ฉันมักจะพบสถานการณ์ที่ฉันต้องตรวจสอบว่าฟังก์ชั่นเป็นรหัสดั้งเดิม-นี่เป็นเนื้อหาที่สำคัญมากในการทดสอบการทำงาน: เป็นฟังก์ชั่นที่สนับสนุนโดยเบราว์เซอร์ในตัวหรือจำลองผ่านไลบรารีคลาสบุคคลที่สาม ในการตรวจจับสิ่งนี้วิธีที่ง่ายที่สุดคือการตัดสินค่าที่ส่งคืนโดยวิธีการ ToString ของฟังก์ชั่น
รหัส JavaScript
จริงๆแล้วมันค่อนข้างง่ายที่จะตรวจสอบว่าฟังก์ชั่นเป็นภาษาพื้นเมือง:
// ตรวจสอบว่าฟังก์ชัน Native ฟังก์ชั่น isnative (fn) {// ตัวอย่าง: // alert.toString () // "ฟังก์ชั่นการแจ้งเตือน () {[รหัสดั้งเดิม]}" // '' + FN ใช้การแปลงประเภทโดยนัยของ JS return (// {/s*/[รหัสดั้งเดิม/]/s*/}/). ทดสอบ ('' + fn); -แปลงฟังก์ชั่นเป็นตัวแทนสตริงและทำการจับคู่ปกตินี่คือหลักการของการใช้งาน
เวอร์ชันอัพเกรดอัปเดต!
; (ฟังก์ชั่น () {// รับวิธี toString ของวัตถุใช้ในการประมวลผลภายใน (ภายใน) ของค่าที่ส่งผ่านในพารามิเตอร์ `[[คลาส]]` var toString = object.prototype.toString; Constructors (Host Constructors), // (Safari> 4; เอาต์พุตเฉพาะอาร์เรย์เฉพาะ) var rehostctor =/^/[object. +? constructor/] $/; String (ToString) // หลบหนีอักขระพิเศษทั้งหมดที่เกี่ยวข้องกับการแสดงออกปกติ พารามิเตอร์ของวิธีการ .replace (/toString | (ฟังก์ชั่น).*? (? = /// () | สำหรับ. +? (? = ///])/g, '$ 1*?') // endword + '$'); ฟังก์ชั่น isnative (value) {// ประเภทผู้ตัดสินประเภทของประเภท var type = typeof value; type return == 'function' // ใช้วิธี `function#toString` วิธีการโทร // แทนที่จะให้ความสำคัญกับวิธี` ToString` ของคุณเอง // เพื่อหลีกเลี่ยงการถูกหลอกโดยการปลอมแปลง - Renative.test (fntostring.call (value)) // ถ้าประเภทไม่ใช่ 'ฟังก์ชั่น', // คุณต้องตรวจสอบวัตถุโฮสต์ (วัตถุโฮสต์), // เนื่องจากสภาพแวดล้อม (เบราว์เซอร์) บางอย่างจะรักษาอาร์เรย์ที่พิมพ์เป็นวิธี DOM // ในเวลานี้ เท็จ; - // คุณสามารถกำหนด isnative ให้กับตัวแปร/วัตถุที่คุณต้องการ window.isnative = isnative; -รหัสทดสอบ:
isnative (isnative) // false isnative (แจ้งเตือน) // true window.isnative (window.isnative) // window.isnative (window.alert) // true window.isnative (string.tostring) // true