วิธีที่ดีที่สุดในการตรวจสอบอินสแตนซ์ของวัตถุคือผ่านโอเปอเรเตอร์ของอินสแตนซ์หรือด้วยเมธอดisPrototypeOf ()ซึ่งตรวจสอบว่าต้นแบบของวัตถุอยู่ในห่วงโซ่ต้นแบบของวัตถุอื่นหรือไม่
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
แต่บางครั้งมันอาจล้มเหลวในกรณีของอินสแตนซ์ jQuery หลายรายการในเอกสาร ในฐานะ @Georgiy Ivankin พูดถึง:
ถ้าฉันมี$
ใน namespace ปัจจุบันของฉันชี้ไปที่jQuery2
และฉันมีวัตถุจาก namespace ด้านนอก (ที่$
อยู่jQuery1
) แล้วฉันไม่มีวิธีที่จะใช้instanceof
สำหรับการตรวจสอบว่าวัตถุนั้นเป็นjQuery
วัตถุ
วิธีหนึ่งที่จะเอาชนะปัญหานั้นได้คือการใช้นามแฝงวัตถุ jQuery ในการปิดหรือIIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
วิธีอื่นในการเอาชนะปัญหานั้นคือการสอบถามjquery
คุณสมบัติในobj
'jquery' in obj
อย่างไรก็ตามหากคุณพยายามทำการตรวจสอบด้วยค่าดั้งเดิมมันจะทำให้เกิดข้อผิดพลาดดังนั้นคุณสามารถแก้ไขการตรวจสอบก่อนหน้าได้โดยทำให้แน่ใจว่าobj
เป็นObject
'jquery' in Object(obj)
แม้ว่าวิธีก่อนหน้านี้จะไม่ปลอดภัยที่สุด (คุณสามารถสร้าง'jquery'
คุณสมบัติในวัตถุ) แต่เราสามารถปรับปรุงการตรวจสอบโดยการทำงานกับทั้งสองวิธี:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
ปัญหาที่นี่คือวัตถุใด ๆ ที่สามารถกำหนดคุณสมบัติjquery
เป็นของตัวเองดังนั้นวิธีที่ดีกว่าคือการถามในต้นแบบและให้แน่ใจว่าวัตถุนั้นไม่ได้null
หรือundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
เนื่องจากการบังคับของif
คำสั่งที่จะทำให้ไฟฟ้าลัดวงจรโดยการประเมิน&&
ผู้ประกอบการเมื่อobj
มีการใด ๆ ของfalsyค่า ( null
, undefined
, false
, 0
, ""
) และจากนั้นก็จะดำเนินการตรวจสอบอื่น ๆ
ในที่สุดเราสามารถเขียนฟังก์ชั่นยูทิลิตี้:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
ลองดูที่: ผู้ประกอบการตรรกะและความจริง / เท็จ
selector
คุณสมบัติถูกเลิกใช้มานานแล้วและถูกลบใน 3.0 แม้ในรุ่นก่อนหน้าวัตถุ jQuery สามารถมีสตริงตัวเลือกที่ว่างเปล่าตัวอย่างเช่น$(window)
ไม่มีตัวเลือก ใช้instanceof
แทน