คำสั่ง for in ใช้ในการแสดงรายการคุณสมบัติ (สมาชิก) ของวัตถุดังต่อไปนี้
คัดลอกรหัสรหัสดังต่อไปนี้:
var obj = { ชื่อ: "แจ็ค",
getName:function(){ส่งคืน this.name}
-
//ชื่อเอาต์พุตgetName
สำหรับ (var atr ใน obj) {
การแจ้งเตือน(atr);
-
คุณสังเกตเห็นหรือไม่ว่าไม่มีคุณสมบัติในตัว (หรือสมาชิกในตัว คุณสมบัติที่ซ่อนอยู่ และคุณสมบัติที่กำหนดไว้ล่วงหน้า) เช่น toString และ valueOf ของ obj นั่นคือ for in ใช้เพื่อระบุสมาชิกที่แสดง (สมาชิกแบบกำหนดเอง) ของออบเจ็กต์
หากคุณแทนที่คุณสมบัติบิวท์อิน ให้เขียน obj's toString ด้านล่างใหม่
คัดลอกรหัสรหัสดังต่อไปนี้:
var obj = {ชื่อ: "แจ็ค",
getName:function(){ส่งคืน this.name},
toString:function(){return "ฉันแจ็ค"}
-
สำหรับ (var atr ใน obj) {
การแจ้งเตือน(atr);
-
จะเอาท์พุตอะไร?
1. ภายใต้ IE6/7/8 จะเหมือนกับโดยไม่ต้องเขียน toString ใหม่ และยังคงส่งออกเฉพาะชื่อและ getName เท่านั้น
2. ภายใต้ IE9/Firefox/Chrome/Opera/Safari ชื่อ getName, toString จะถูกส่งออก
หากคุณเพิ่มคุณสมบัติ/วิธีการให้กับต้นแบบที่มีอยู่แล้วภายใน จะสามารถข้ามผ่านได้ในระหว่างการนำเข้าด้วย
คัดลอกรหัสรหัสดังต่อไปนี้:
Object.prototype.clone = ฟังก์ชั่น () {}
วาร์ obj = {
ชื่อ'แจ๊ค'
อายุ: 33
-
// ชื่อ อายุ โคลน
สำหรับ (var n ใน obj) {
การแจ้งเตือน(n)
-
เมธอดโคลนถูกเพิ่มเข้าไปใน Object.prototype และเบราว์เซอร์ทั้งหมดจะแสดงโคลนเมื่อเข้ามา
สิ่งนี้อาจไม่สำคัญ เนื่องจากโดยทั่วไปไม่แนะนำให้ขยายต้นแบบของตัวสร้างในตัว ซึ่งเป็นสาเหตุหนึ่งที่ทำให้ Prototype.js ลดลง jQuery และ Underscore ไม่ได้ขยายต้นแบบของตนเอง สิ่งแรกสร้างความยุ่งยากเกี่ยวกับวัตถุ jQuery ในขณะที่วิธีหลังเพียงแค่แขวนวิธีการทั้งหมดไว้ใต้ขีดล่าง
แต่บางครั้งเพื่อให้เข้ากันได้กับ ES5 หรือเวอร์ชันต่อๆ ไป เราจะขยายต้นแบบของ Constructor ในตัวบนเบราว์เซอร์ที่ไม่รองรับ ES5 (IE6/7/8) ในกรณีนี้ เนื่องจาก in จะแตกต่างกันในแต่ละอัน เบราว์เซอร์ ดังต่อไปนี้
คัดลอกรหัสรหัสดังต่อไปนี้:
ถ้า (!Function.prototype.bind) {
Function.prototype.bind = ฟังก์ชั่น (ขอบเขต) {
วาร์ fn = นี่
ฟังก์ชันส่งคืน () {
fn.apply (ขอบเขต ข้อโต้แย้ง)
-
-
-
ฟังก์ชั่นทักทาย (ชื่อ) {
การแจ้งเตือน (this.greet + ', ' + ชื่อ)
-
สำหรับ (var n ในทักทาย) {
การแจ้งเตือน(n)
-
เอาต์พุต IE6/7/8 ผูกกัน แต่เบราว์เซอร์อื่นไม่ผูกกัน เนื่องจากการผูกได้รับการสนับสนุนโดยกำเนิดในเบราว์เซอร์สมัยใหม่ และสำหรับ in ไม่พร้อมใช้งาน IE6/7/8 จะเพิ่มการผูกให้กับ Function.prototype
โดยสรุป: ในการออกแบบข้ามเบราว์เซอร์ เราไม่สามารถพึ่งพา for in เพื่อรับชื่อสมาชิกของออบเจ็กต์ได้ โดยทั่วไปเราใช้ hasOwnProperty เพื่อตัดสิน