JS มีออบเจ็กต์ ฟังก์ชัน และคอนสตรัคเตอร์ในตัวเพื่อให้เราเขียนโปรแกรมได้ เช่น Math, parseInt, Object, Array เป็นต้น ทั้งหมดนี้มองเห็นได้และสามารถนำมาใช้ระหว่างการเขียนโปรแกรมได้ ตัวอย่างเช่น ฉันสามารถใช้ new Object หรือ new Array ได้
บางส่วนมองไม่เห็นและสามารถจัดหาให้โดยเครื่องยนต์ในสถานการณ์พิเศษเท่านั้น ออบเจ็กต์ประเภทนี้มักจะมีฟังก์ชันการทำงานลดลง นี่คือบางส่วน
1. ประเภทข้อโต้แย้ง
ประเภทอาร์กิวเมนต์ไม่สามารถมีอ็อบเจ็กต์ที่โปรแกรมเมอร์สร้างขึ้นด้วยตนเองได้ กล่าวคือ คุณไม่สามารถสร้างอาร์กิวเมนต์ใหม่() ได้ มันมีและมีเพียงข้อโต้แย้งวัตถุเดียวเท่านั้น
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น func() {
console.log(อาร์กิวเมนต์[0]) // 1
console.log(อาร์กิวเมนต์.ความยาว) // 3
-
สนุก(1, 2, 3)
วัตถุอาร์กิวเมนต์จะถูกสร้างขึ้นเมื่อมีการเรียกใช้ฟังก์ชัน และจะมองเห็นได้และใช้ภายในฟังก์ชันเท่านั้น คุณจะเห็นว่าอาร์กิวเมนต์นั้นคล้ายกับ Array มาก องค์ประกอบสามารถดึงข้อมูลได้ด้วยดัชนี และยังมีแอตทริบิวต์ความยาวอีกด้วย แต่มันไม่ใช่ Array มันไม่มีวิธีการบางอย่างของ Array เช่น push, pop เป็นต้น อาร์กิวเมนต์ถูกกำหนดไว้ใน ES5 10.6
2. ฟังก์ชั่นที่ส่งคืนโดยการผูกมีความพิเศษมาก
bind เป็นเมธอดใหม่ที่เพิ่มโดย ES5 ให้กับ Function.prototype มันถูกเรียกใช้โดยตรงบนฟังก์ชัน เช่น call/apply ส่งคืนฟังก์ชันพร้อมบริบทและพารามิเตอร์ที่ระบุ
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น func (อายุ) {
console.log('ชื่อ: ' + this.name + ', อาชีพ: ' + อายุ)
-
คน var = {ชื่อ: 'จอห์น แม็กคาร์ธี'}
var f1 = func.bind(บุคคล, 'นักวิทยาศาสตร์คอมพิวเตอร์')
f1() // ชื่อ: John McCarthy อาชีพ: นักวิทยาศาสตร์คอมพิวเตอร์
คุณจะเห็นว่าฟังก์ชันที่ส่งคืน f1 ถูกเรียกโดยใช้วงเล็บเหมือนฟังก์ชันปกติ ทุกอย่างทำงานได้ดี แต่โค้ดต่อไปนี้จะทำให้คุณประหลาดใจ
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น func (อายุ) {
console.log('ชื่อ: ' + this.name + ', อาชีพ: ' + อายุ)
-
คน var = {ชื่อ: 'จอห์น แม็กคาร์ธี'}
var f1 = func.bind(บุคคล, 'นักวิทยาศาสตร์คอมพิวเตอร์')
console.log(f1.prototype) // ไม่ได้กำหนด
เมื่อเปรียบเทียบกับโค้ดข้างต้น ประโยคสุดท้ายจะแตกต่างออกไป f1() จะไม่ถูกดำเนินการ แต่ f1.prototype ถูกพิมพ์ออกมาและพบว่าไม่ได้กำหนดไว้
แปลก? ไม่ใช่ว่าทุกฟังก์ชันจะมีแอตทริบิวต์ต้นแบบใช่หรือไม่ สิ่งนี้ใช้เพื่อนำมรดกต้นแบบไปใช้ อันที่จริงฟังก์ชันที่ส่งคืนโดยการผูกนั้นมีความพิเศษ แต่ไม่มีต้นแบบ ฟังก์ชันพิเศษนี้สร้างขึ้นโดยเอ็นจิ้น JS และไม่สามารถวัดได้โดยตรงโดยโปรแกรมเมอร์ไคลเอนต์ผ่านการประกาศฟังก์ชันหรือฟังก์ชัน
สิ่งนี้ระบุไว้อย่างชัดเจนในข้อกำหนด ES5 15.3.4.5