2 ¢ของฉัน! จริงๆส่วนหนึ่งของเหตุผลที่ฉันโยนนี้ขึ้นที่นี่แม้จะมีรายชื่อยาวของคำตอบคือการให้เล็ก ๆ น้อย ๆการแก้ปัญหาชนิดและได้รับกลับมาฟีดในอนาคตเกี่ยวกับวิธีการขยายให้มีมากกว่าall in one
real types
ด้วยวิธีการแก้ปัญหาต่อไปนี้เป็นข้างต้นรวมทั้งคู่ของการแก้ปัญหาที่พบที่นี่เช่นเดียวกับการรวมการแก้ไขกลับค่าjQueryใน jQuery วัตถุที่กำหนดถ้ามี ฉันยังผนวกวิธีการไปยังต้นแบบวัตถุดั้งเดิม ฉันรู้ว่ามักจะเป็นข้อห้ามตามที่มันจะยุ่งเกี่ยวกับนามสกุลอื่น ๆ ดังกล่าว user beware
แต่ฉันออกจากที่ หากคุณไม่ชอบวิธีนี้เพียงคัดลอกฟังก์ชันพื้นฐานทุกที่ที่คุณต้องการและแทนที่ตัวแปรทั้งหมดthis
ด้วยพารามิเตอร์อาร์กิวเมนต์เพื่อส่งต่อ (เช่นอาร์กิวเมนต์ [0])
;(function() { // Object.realType
function realType(toLower) {
var r = typeof this;
try {
if (window.hasOwnProperty('jQuery') && this.constructor && this.constructor == jQuery) r = 'jQuery';
else r = this.constructor && this.constructor.name ? this.constructor.name : Object.prototype.toString.call(this).slice(8, -1);
}
catch(e) { if (this['toString']) r = this.toString().slice(8, -1); }
return !toLower ? r : r.toLowerCase();
}
Object['defineProperty'] && !Object.prototype.hasOwnProperty('realType')
? Object.defineProperty(Object.prototype, 'realType', { value: realType }) : Object.prototype['realType'] = realType;
})();
จากนั้นใช้อย่างง่ายดายเช่น:
obj.realType() // would return 'Object'
obj.realType(true) // would return 'object'
หมายเหตุ:มี 1 อาร์กิวเมนต์ที่สามารถผ่านได้ ถ้าเป็นบูtrue
ลแล้วผลตอบแทนจะเป็นตัวพิมพ์เล็กเสมอ
ตัวอย่างเพิ่มเติม:
true.realType(); // "Boolean"
var a = 4; a.realType(); // "Number"
$('div:first').realType(); // "jQuery"
document.createElement('div').realType() // "HTMLDivElement"
หากคุณมีอะไรเพิ่มเติมที่อาจเป็นประโยชน์เช่นการกำหนดเมื่อวัตถุถูกสร้างขึ้นด้วยห้องสมุดอื่น (หมู่ Proto, Yui, Dojo, ฯลฯ ... ) โปรดแสดงความคิดเห็นหรือแก้ไขสิ่งนี้และทำให้มันเป็นมากกว่า ถูกต้องและแม่นยำ หรือหมุนไปที่GitHubฉันทำเพื่อมันและแจ้งให้เราทราบ คุณจะพบลิงค์ด่วนไปยังไฟล์ cdn min ที่นั่น
typeof new RegExp(/./); // "function"
ปัญหาใน Chrome ดูเหมือนจะได้รับการแก้ไขใน Chrome 14