JavaScript เชิงวัตถุ (OOJS) 3 วิธีในการสร้างอินสแตนซ์ของวัตถุ
เมื่อเป็นภาษาโปรแกรม ทุกอย่างเกี่ยวกับวัตถุ, สิ่งแรกที่เราต้องเรียนรู้คือ วิธีสร้างวัตถุ. การสร้างวัตถุใน JavaScript นั้นค่อนข้างง่าย: วงเล็บปีกกาคู่ จะทำงานอย่างไรนั่นคือ ไม่ใช่วิธีเดียว เพื่อสร้างวัตถุ หรือวิธีเดียว คุณจะต้องใช้.
ในจาวาสคริปต์อินสแตนซ์ของวัตถุคือ สร้างขึ้นจากวัตถุในตัว และเกิดขึ้นเมื่อโปรแกรมกำลังทำงาน ตัวอย่างเช่น, วันที่
เป็นวัตถุในตัวที่ให้ข้อมูลเกี่ยวกับวันที่ หากเราต้องการแสดงวันที่ปัจจุบันบนหน้าเรา ต้องการอินสแตนซ์ของ วันที่
ที่นำข้อมูลเกี่ยวกับวันที่ปัจจุบัน.
JavaScript ยังช่วยให้เรา กำหนดวัตถุของเราเอง ที่สามารถสร้างอินสแตนซ์วัตถุของตนเองในรันไทม์ ในจาวาสคริปต์, ทุกอย่างเป็นวัตถุ และทุกวัตถุมี สุดยอดบรรพบุรุษ เรียกว่า วัตถุ
. การสร้างวัตถุเช่นเรียกว่า instantiation.
1. ใหม่
ผู้ประกอบการ
หนึ่งในวิธีที่ใช้กันทั่วไปและเป็นที่รู้จักกันดีในการสร้างตัวอย่างวัตถุใหม่ก็คือ ใช้ ใหม่
ผู้ประกอบการ.
คุณต้องการ นวกรรมิก ที่จะทำให้ ใหม่
ผู้ประกอบการทำงาน ตัวสร้างเป็นวิธีการของวัตถุที่รวมกัน ตัวอย่างใหม่ของวัตถุนั้น. ไวยากรณ์พื้นฐานของมันมีลักษณะดังนี้:
ตัวสร้างใหม่ ()
คอนสตรัคสามารถ ยอมรับข้อโต้แย้ง ที่สามารถใช้เพื่อเปลี่ยนหรือเพิ่มคุณสมบัติให้กับอินสแตนซ์ของวัตถุที่สร้างขึ้น ตัวสร้าง มีชื่อเดียวกัน เป็นวัตถุมันเป็นของ.
นี่คือตัวอย่างวิธีการสร้าง ตัวอย่างของ วันที่ ()
วัตถุ กับ ใหม่
คำสำคัญ:
dt = ใหม่วันที่ (2017, 0, 1) console.log (dt) // อาทิตย์ 1 มกราคม 2017 00:00:00 GMT + 0100
วันที่ ()
เป็นตัวสร้างการสร้างใหม่ วันที่
วัตถุ. คอนสตรัคเตอร์ที่แตกต่างกันสำหรับวัตถุ ใช้อาร์กิวเมนต์ที่แตกต่างกัน เพื่อสร้างอินสแตนซ์ของวัตถุชนิดเดียวกันกับ คุณลักษณะที่หลากหลาย.
วัตถุที่มีอยู่ในตัวบางตัวใน JavaScript นั้นสามารถสร้างอินสแตนซ์ได้ วันที่
. มีวัตถุอยู่ ไม่ต้องมีคอนสตรัคเตอร์: คณิตศาสตร์
, JSON
และ สะท้อน
, แต่พวกมันยังคงเป็นวัตถุธรรมดา.
ในบรรดาวัตถุในตัวที่มีตัวสร้าง, สัญลักษณ์
ไม่สามารถเรียกในสไตล์คอนสตรัคเตอร์ เพื่อยกตัวอย่างใหม่ สัญลักษณ์
ตัวอย่าง. มันสามารถเท่านั้น เรียกว่าเป็นฟังก์ชั่น ซึ่งส่งกลับใหม่ สัญลักษณ์
ราคา.
นอกจากนี้ในบรรดาวัตถุในตัวที่มีคอนสตรัคเตอร์ไม่จำเป็นต้องเรียกใช้คอนสตรัคเตอร์ด้วย ใหม่
ผู้ประกอบการเพื่อที่จะยกตัวอย่าง. ฟังก์ชัน
, แถว
, ความผิดพลาด
, และ นิพจน์ทั่วไป
สามารถเรียกได้ว่าเป็นฟังก์ชั่น, โดยไม่ต้องใช้ ใหม่
คำหลักและพวกเขาจะยกตัวอย่างและส่งกลับอินสแตนซ์วัตถุใหม่.
2. การ สะท้อน
วัตถุ
โปรแกรมเมอร์แบ็กเอนด์อาจคุ้นเคยกับ Reflection APIs. Reflection เป็นคุณสมบัติของภาษาโปรแกรม ตรวจสอบและอัพเดทเอนทิตีพื้นฐานบางอย่าง, เช่นวัตถุและคลาส, ที่รันไทม์.
ใน JavaScript คุณสามารถดำเนินการได้แล้ว บาง สะท้อนการดำเนินงานโดยใช้ วัตถุ
. แต่ก API การสะท้อนที่เหมาะสม ในที่สุดก็มีอยู่ใน JavaScript เช่นกัน.
สะท้อน
วัตถุมีชุดของวิธีการ สร้างและอัพเดตอินสแตนซ์ของวัตถุ. สะท้อน
วัตถุ ไม่มีตัวสร้าง, ดังนั้นจึงไม่สามารถสร้างอินสแตนซ์ของ ใหม่
ผู้ประกอบการและเช่นเดียวกับ คณิตศาสตร์
และ JSON
, มัน ไม่สามารถเรียกใช้เป็นฟังก์ชันได้ ทั้ง.
อย่างไรก็ตาม, สะท้อน
มี เทียบเท่ากับ ใหม่
ผู้ประกอบการ: Reflect.construct ()
วิธี.
Reflect.construct (เป้าหมาย, อาร์กิวเมนต์List [, newTarget])
ทั้งคู่ เป้า
และตัวเลือก NEWTARGET
ข้อโต้แย้งคือ วัตถุที่มีตัวสร้างของตัวเอง, ในขณะที่ argumentsList
คือ รายการข้อโต้แย้ง จะถูกส่งผ่านไปยังผู้สร้างของ เป้า
.
var dt = Reflect.construct (วันที่, [2017, 0, 1]); console.log (DT); // Sun Jan 01 2017 00:00:00 GMT + 0100
รหัสด้านบน มีผลเหมือนกัน เป็นการยกตัวอย่าง วันที่ ()
ใช้ ใหม่
ผู้ประกอบการ แม้ว่าคุณจะยังสามารถใช้งานได้ ใหม่
, การสะท้อนกลับเป็น ECMAScript 6 มาตรฐาน. มันยังช่วยให้คุณ ใช้ประโยชน์จาก NEWTARGET
ข้อโต้แย้ง, ซึ่งเป็นข้อได้เปรียบมากกว่าอีก ใหม่
ผู้ประกอบการ.
คุณค่าของ NEWTARGET
ต้นแบบของ (ที่แน่นอนมันเป็นต้นแบบของ NEWTARGET
ตัวสร้างของ) กลายเป็นต้นแบบของอินสแตนซ์ที่สร้างขึ้นใหม่.
ต้นแบบคือ คุณสมบัติของวัตถุ, ค่าของซึ่งคือ ยังวัตถุ, แบกคุณสมบัติของวัตถุต้นฉบับ ในระยะสั้นวัตถุได้รับสมาชิกจากต้นแบบ.
ที่นี่เรามาดูตัวอย่าง:
คลาส A คอนสตรัคเตอร์ () this.message = ฟังก์ชัน () console.log ('ข้อความจาก A') คลาส B คอนสตรัค () ข้อความ () console.log ('ข้อความจาก B') data () console.log ('data from B') obj = Reflect.construct (A, [], B) console.log (obj.message ()); // ข้อความจาก A console.log (obj.data ()); // data จาก B console.log (obj instanceof B) // true
โดยผ่าน B
เป็นอาร์กิวเมนต์ที่สามไป Reflect.construct ()
, ค่าต้นแบบของ obj
วัตถุคือ ทำให้เหมือนกัน เป็นต้นแบบของ B
ตัวสร้างของ (ซึ่งมีคุณสมบัติ ข่าวสาร
และ ข้อมูล
).
ดังนั้น, obj
สามารถเข้าถึง ข่าวสาร
และ ข้อมูล
, มีให้ที่ต้นแบบของมัน แต่ตั้งแต่ obj
ทำโดยใช้ , มันยังมีของตัวเอง
ข่าวสาร
มัน ได้รับจาก .
ถึงแม้ว่า obj
ถูกสร้างเป็นอาร์เรย์มันเป็น ไม่ใช่ตัวอย่างของ แถว
, เพราะต้นแบบถูกตั้งค่าเป็น วัตถุ
.
obj = Reflect.construct (Array, [1,2,3], Object) console.log (obj) // Array [1, 2, 3] console.log (obj instanceof Array) // false
Reflect.construct ()
มีประโยชน์เมื่อคุณต้องการสร้างวัตถุ ใช้มากกว่าหนึ่งพิมพ์เขียว.
3. Object.create ()
วิธี
คุณยังสามารถสร้าง วัตถุธรรมดาใหม่ที่มีต้นแบบเฉพาะ ผ่านทาง Object.create ()
. นี่ก็อาจดูเหมือนคล้ายกันมากกับการใช้ ใหม่
ผู้ประกอบการ แต่มันไม่ได้.
Object.create (O [, PropertiesObject])
O
อาร์กิวเมนต์เป็นวัตถุที่ ทำหน้าที่ต้นแบบ สำหรับวัตถุใหม่ที่จะถูกสร้างขึ้น ตัวเลือก propertiesObject
การโต้แย้งคือ รายการคุณสมบัติ คุณอาจต้องการเพิ่มไปยังวัตถุใหม่.
คลาส A คอนสตรัคเตอร์ () ข้อความ () console.log ('ข้อความจาก A') var obj = Object.create (ใหม่ A (), ข้อมูล: เขียนได้: จริง, กำหนดค่าได้: จริง, ค่า: function () return 'data from obj') console.log (obj.message ()) // ข้อความจาก A console.log (obj.data ()) // ข้อมูลจาก obj obj1 = Object.create ( ใหม่ A (), foo: เขียนได้: จริง, กำหนดค่าได้: จริง, ค่า: function () ส่งคืน 'foo จาก obj1') console.log (obj1.message ()) // ข้อความจากคอนโซล log (obj1.foo ()) // foo จาก obj1
ใน obj
วัตถุคุณสมบัติที่เพิ่มเข้ามาคือ ข้อมูล
, ขณะที่อยู่ใน obj1
, มันเป็น foo
. อย่างที่คุณเห็นเรามี คุณสมบัติและวิธีการเพิ่มให้กับวัตถุใหม่.
นี่เป็นสิ่งที่ยอดเยี่ยมเมื่อคุณต้องการสร้าง วัตถุหลายชนิดที่เหมือนกัน แต่ด้วย คุณสมบัติหรือวิธีการเสริมที่แตกต่างกัน. Object.create ()
ไวยากรณ์บันทึกปัญหาของการเข้ารหัสทั้งหมดแยกต่างหาก.