โฮมเพจ » การเข้ารหัส » JavaScript เชิงวัตถุ (OOJS) 3 วิธีในการสร้างอินสแตนซ์ของวัตถุ

    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 () ไวยากรณ์บันทึกปัญหาของการเข้ารหัสทั้งหมดแยกต่างหาก.

    บทความก่อนหน้า
    NVIDIA GeFORCE 8600 GTS