สิ่งสำคัญที่ควรทราบคือที่นี่เนื่องจาก Javascript เป็นภาษาแบบไดนามิกวัตถุทุกชิ้นจึงเป็นเพียงแฮชแผนที่ที่มีชื่อเสียง ( มีข้อยกเว้นเล็กน้อย ) และทุกอย่างในวัตถุ Javascript สามารถเข้าถึงได้สองวิธี - เครื่องหมายวงเล็บและเครื่องหมายจุด
ฉันจะอ่านทั้งสองอย่างรวดเร็วเพื่อตอบคำถามแรกของคุณจากนั้นฉันจะไปที่ส่วนที่สอง
เครื่องหมายวงเล็บ
โหมดนี้คล้ายกับการเข้าถึง hashmaps และอาร์เรย์ในภาษาการเขียนโปรแกรมอื่น ๆ คุณสามารถเข้าถึงส่วนประกอบใด ๆ (ข้อมูล (รวมถึงวัตถุอื่น ๆ ) หรือฟังก์ชั่น) โดยใช้ไวยากรณ์นี้
นี่คือสิ่งที่คุณทำในตัวอย่างของคุณ คุณมี'a'
ซึ่งเป็นสตริง (และไม่ใช่ตัวอักษรตามตัวอักษรเหมือนจะเป็นภาษาเช่น C ++)
ใช้เครื่องหมายวงเล็บคุณเข้าถึงtoUpperCase
วิธีการ แต่การเข้าถึงมันยังไม่เพียงพอ alert
ตัวอย่างเช่นพิมพ์ใน Javascript ไม่เรียกวิธีการนี้ มันเป็นเพียงคำสั่งง่ายๆ ในการเรียกใช้งานฟังก์ชั่นนี้คุณจะต้องเพิ่มวงเล็บ: alert()
แสดงกล่องโต้ตอบอย่างง่ายที่มีอยู่undefined
เนื่องจากไม่ได้รับพารามิเตอร์ ตอนนี้เราสามารถใช้ความรู้นี้เพื่อถอดรหัสรหัสของคุณซึ่งกลายเป็น:
alert('a'.toUpperCase());
ซึ่งอ่านได้มากขึ้น
ที่จริงแล้ววิธีที่ดีในการเข้าใจสิ่งนี้ดีขึ้นเล็กน้อยคือการใช้งาน Javascript ต่อไปนี้:
alert(alert)
สิ่งนี้เรียกalert
โดยผ่านมันเป็นอ็อบเจกต์ของฟังก์ชั่นเช่นalert
กันโดยไม่ต้องดำเนินการเตือนที่สอง สิ่งที่แสดง (ใน Chrome 26 อย่างน้อย) มีดังต่อไปนี้:
function alert() { [native code] }
โทรศัพท์:
alert(alert())
undefined
แสดงให้เห็นสองกล่องข้อความที่มีการติดต่อกัน นี่เป็นเรื่องง่ายที่จะอธิบาย: ด้านในalert()
จะถูกดำเนินการก่อนแสดงundefined
(เพราะไม่มีพารามิเตอร์ใด ๆ ) และไม่ส่งคืนอะไร การแจ้งเตือนด้านนอกได้รับค่าตอบแทนของการแจ้งเตือนภายใน - ซึ่งไม่มีอะไรเลยและยังแสดงundefined
ในกล่องข้อความ
ลองทุกกรณีใน jsFiddle!
เครื่องหมายดอท
นี่เป็นวิธีมาตรฐานที่ช่วยให้สมาชิกของวัตถุสามารถเข้าถึงได้โดยใช้ตัวดำเนินการ dot ( .
) นี่คือลักษณะที่โค้ดของคุณจะมีลักษณะเป็นดอทโน้ต:
alert('a'.toUpperCase())
อ่านได้มากขึ้น ดังนั้นเมื่อไหร่ที่เราควรใช้เครื่องหมายจุดและเมื่อไหร่ที่เราควรใช้เครื่องหมายวงเล็บ?
การเปรียบเทียบ
ความแตกต่างที่สำคัญระหว่างทั้งสองวิธีคือความหมาย นอกจากนี้ยังมีรายละเอียดอื่น ๆ อีกด้วย แต่ฉันจะไปหาคนเหล่านั้นในไม่ช้า สิ่งที่สำคัญที่สุดคือสิ่งที่คุณต้องการทำจริงๆ - กฎง่ายๆคือคุณใช้เครื่องหมายจุดสำหรับเขตข้อมูลที่ได้รับการยอมรับและวิธีการที่วัตถุมีและเครื่องหมายวงเล็บสำหรับเมื่อคุณใช้วัตถุของคุณเป็นแผนที่แฮชจริง ๆ .
ตัวอย่างที่ดีว่าทำไมกฎนี้มีความสำคัญมากจนสามารถแสดงในตัวอย่างของคุณได้เนื่องจากโค้ดใช้เครื่องหมายวงเล็บในสถานที่ที่เครื่องหมายจุดมีความสมเหตุสมผลมากกว่าทำให้อ่านรหัสได้ยากขึ้น และนั่นคือสิ่งที่ไม่ดีเพราะรหัสจะอ่านหลายครั้งมากขึ้นกว่าที่มันจะถูกเขียน
ในบางกรณีคุณต้องใช้เครื่องหมายวงเล็บแม้ว่าการใช้เครื่องหมายจุดจะสมเหตุสมผลมากขึ้น:
หากสมาชิกของวัตถุมีชื่อที่มีช่องว่างอย่างน้อยหนึ่งช่องหรืออักขระพิเศษอื่น ๆ คุณจะไม่สามารถใช้เครื่องหมายจุด: foo.some method()
ไม่ทำงาน แต่foo["some method"]()
ใช้;
หากคุณต้องการเข้าถึงสมาชิกของวัตถุแบบไดนามิกคุณยังติดอยู่โดยใช้เครื่องหมายวงเล็บ
ตัวอย่าง:
for(var i = 0; i < 10; ++i) {
foo["method" + i]();
}
บรรทัดล่างคือคุณควรใช้ไวยากรณ์ของวงเล็บปีกกาเมื่อใช้วัตถุเป็นแผนที่กัญชา ( foods["burger"].eat()
) และไวยากรณ์จุดเมื่อทำงานกับเขตข้อมูลและวิธีการ "ที่แท้จริง" ( enemy.kill()
) ด้วย Javascript เป็นภาษาแบบไดนามิก, เส้นระหว่างเขตข้อมูล "จริง" และวิธีการของวัตถุและข้อมูล "อื่น ๆ " เก็บไว้ภายในสามารถเบลอสวย แต่ตราบใดที่คุณไม่ผสมพวกเขาในรูปแบบที่สับสนคุณก็น่าจะสบายดี
ตอนนี้คำถามที่เหลือของคุณ (ในที่สุด!: P)
ฉันจะแน่ใจได้อย่างไรว่าเมธอดจะเป็นสมาชิกของ obj เสมอ
คุณทำไม่ได้ ลองมัน. ลองโทรหาderp
สาย คุณจะได้รับข้อผิดพลาดในบรรทัด:
Uncaught TypeError: Object a has no method 'derp'
มันเป็นฟังก์ชั่นทั่วไปครับที่จะเรียกวิธีการใด ๆ บนวัตถุใด ๆ แต่นั่นหมายความว่าวิธีที่ระบุจะเป็นสมาชิกโดยนัยของวัตถุที่ระบุหรือไม่
ใช่ในกรณีของคุณมันจะต้องเป็น มิฉะนั้นคุณจะจบลงด้วยข้อผิดพลาดที่ฉันกล่าวถึงข้างต้น อย่างไรก็ตามคุณไม่จำเป็นต้องใช้return obj[method]();
ในcallMethod()
ฟังก์ชั่น คุณสามารถเพิ่มฟังก์ชั่นของคุณเองซึ่งจะถูกใช้โดยฟังก์ชั่นแผนที่ ต่อไปนี้เป็นวิธีการกำหนดค่าตายตัวที่เปลี่ยนตัวอักษรทั้งหมดให้เป็นตัวพิมพ์ใหญ่:
function makeCap()
{
return function(obj) {
return obj.toUpperCase();
}
}
var caps2 = map(['a', 'b', 'c'], makeCap()); // ['A','B','C']
console.log(caps2)
รหัสในการกวดวิชาที่คุณเชื่อมโยงกับการใช้งานฟังก์ชั่นบางส่วน พวกเขาเป็นแนวคิดที่ซับซ้อนด้วยตัวเอง การอ่านเพิ่มเติมเกี่ยวกับเรื่องนั้นจะช่วยให้สิ่งต่าง ๆ ชัดเจนขึ้นกว่าที่ฉันเคยทำได้
หมายเหตุ: นี่คือรหัสของฟังก์ชั่นแผนที่ที่ใช้โดยรหัสในคำถามที่ว่าแหล่งที่มาที่นี่
function map(arr, iterator) {
var narr = [];
for (var i = 0; i < arr.length; i++) narr.push(iterator(arr[i], i));
return narr;
}
arr[5]
คุณรู้อยู่แล้วว่าเกี่ยวกับเกี่ยวกับสัญกรณ์วงเล็บเพราะคุณมักจะใช้มันเมื่อมีการเข้าถึงองค์ประกอบมากมาย:arr.5
ถ้าตัวเลขที่ชื่อระบุที่ถูกต้องคุณสามารถใช้จุดสัญกรณ์: