ห่วงโซ่ต้นแบบค่อนข้างสับสนที่จะเข้าใจและมีข้อมูลออนไลน์มากมาย ทุกครั้งที่ฉันนอนไม่หลับตอนกลางคืนฉันมักจะหาห่วงโซ่ต้นแบบและปิดบทความออนไลน์เพื่ออ่านซึ่งมีประสิทธิภาพมาก
ไม่ต้องกังวลเกี่ยวกับคำศัพท์มากมายเหล่านั้นมันจะไม่ช่วยคุณยกเว้นที่จะทำให้สมองของคุณบิด เพียงแค่ดูห่วงโซ่ต้นแบบอย่างง่าย ๆ และคร่าวๆและคิดเกี่ยวกับสิ่งที่ไม่มีส่วนเกี่ยวข้องกับรหัสเช่นมนุษย์ปีศาจและผู้ชายกระเทย
1) ผู้คนเกิดมาจากมนุษย์และสัตว์ประหลาดเกิดมาโดยปีศาจ มนุษย์และปีศาจเป็นทั้งสองกรณีของวัตถุในขณะที่มนุษย์และปีศาจเป็นต้นแบบ ต้นแบบเป็นวัตถุที่เรียกว่าวัตถุต้นแบบ
2) แม่ของบุคคลและพ่อของเขาสามารถให้กำเนิดเด็กทารกจำนวนมากและแม่ปีศาจและพ่อของเขาสามารถให้กำเนิดลูกจำนวนมาก ภรรยาของผู้ชายและผู้ชายสามารถให้กำเนิดเด็กทารก ผู้ชายเป็นตัวสร้างที่รู้จักกันทั่วไปว่าเป็นผู้ชาย
3) ผู้คนสามารถบันทึกข้อมูลเกี่ยวกับเรื่องเพศเพื่อให้ผู้คนสามารถค้นหาข้อมูลเกี่ยวกับเพศผ่านทางเพศนั่นคือพวกเขาสามารถค้นหาตัวสร้างผ่านวัตถุต้นแบบ
4) ผู้คนสามารถให้กำเนิดทารกจำนวนมากในแม่ของพวกเขา แต่ทารกเหล่านี้มีแม่เพียงคนเดียวซึ่งเป็นเอกลักษณ์ของต้นแบบ
5) ผู้คนเกิดมาโดยผู้คนพวกเขาพบผู้คนผ่านผู้คนแล้วค้นหาผู้คนผ่านผู้คน ... ความสัมพันธ์นี้เรียกว่าห่วงโซ่ต้นแบบ
6) ห่วงโซ่ต้นแบบไม่สิ้นสุด เมื่อคุณมองผ่านผู้คนต่อไปคุณจะพบว่าผู้คนกำลังร่วมเพศ ... ไม่ใช่มนุษย์ร่วมเพศนั่นคือห่วงโซ่ต้นแบบในที่สุดชี้ไปที่โมฆะ
7) ผู้คนที่เกิดมาพร้อมกับแม่จะดูเหมือนผู้คนและสัตว์ประหลาดที่เกิดมาพร้อมกับแม่จะน่าเกลียด สิ่งนี้เรียกว่ามรดก
8) คุณสืบทอดสีผิวของแม่แม่ของคุณสืบทอดสีผิวของแม่แม่ของคุณ ... นี่คือมรดกของห่วงโซ่ต้นแบบ
9) หากคุณไม่มีบ้านบ้านของคุณจะหมายถึงบ้านแม่ของคุณ หากแม่ของคุณไม่มีบ้านบ้านของคุณจะอ้างถึงบ้านแม่ของคุณ ... นี่คือการค้นหาที่เพิ่มขึ้นของห่วงโซ่ต้นแบบ
10) คุณจะสืบทอดรูปร่างหน้าตาของแม่ แต่คุณยังสามารถย้อมผมแชมพูตัดและเป่านั่นคือคุณลักษณะของวัตถุสามารถปรับแต่งได้และจะแทนที่คุณลักษณะที่สืบทอดมา
11) แม้ว่าคุณจะล้าง, ตัด, เป่า, เป่าและย้อมผมสีเหลืองคุณก็ไม่สามารถเปลี่ยนรูปลักษณ์ของแม่ได้ น้องชายและน้องสาวที่เกิดมาเพื่อแม่ของคุณไม่มีส่วนเกี่ยวข้องกับการล้างผมสีเหลืองตัดและผมสีเหลืองเป่านั่นคืออินสแตนซ์ของวัตถุไม่สามารถเปลี่ยนคุณสมบัติของต้นแบบได้
12) แต่ถ้าบ้านของคุณถูกไฟไหม้โดยคุณหมายความว่าแม่และพี่น้องของคุณถูกเผาและนี่คือการแบ่งปันคุณลักษณะต้นแบบ
13) ชื่อเล่นของแม่ของคุณคือ Azhen และป้าของเพื่อนบ้านของเธอเรียกคุณว่า Azhener แต่หลังจากที่ผมของแม่ของคุณเปลี่ยนจาก Piaorou ไปเป็น Golden Lion King, ป้าถัดไปเปลี่ยนคำพูดของเธอและเรียกคุณว่าเจ้าชายสิงโตทองคำ สิ่งนี้เรียกว่าธรรมชาติแบบไดนามิกของต้นแบบ
14) แม่ของคุณชอบความงามและไปเกาหลีเพื่อทำศัลยกรรมพลาสติก เธอจำแม่ไม่ได้ด้วยซ้ำ แม้ว่าผมของแม่ของคุณจะเปลี่ยนกลับไปเป็นความนุ่มนวล แต่เพื่อนบ้านก็ยังเรียกคุณว่าเจ้าชายสิงโตทองคำ เนื่องจากไม่มีใครจำแม่ของคุณได้แม่ของคุณจึงกลับไปที่โรงงานหลังการทำศัลยกรรมพลาสติก นี่คือการเขียนใหม่โดยรวมของต้นแบบ
ประณามมัน! คุณเพียงพอแล้ว! อย่า BB! แสดงรหัส!
ฟังก์ชันบุคคล (ชื่อ) {this.name = name; } function mother () {} mother.prototype = {// ต้นแบบของแม่อายุ: 18, บ้าน: ['ปักกิ่ง', 'เซี่ยงไฮ้']}; person.prototype = ใหม่แม่ (); // ต้นแบบของบุคคลคือแม่ // ใช้เครื่องมือการดีบักโครเมี่ยมเพื่อดูต้นแบบโดยให้อินเทอร์เฟซ __proto__ เพื่อดูต้นแบบ var p1 = บุคคลใหม่ ('jack'); // P1: 'Jack'; __proto __: 18, ['ปักกิ่ง', 'เซี่ยงไฮ้'] var p2 = บุคคลใหม่ ('mark'); // p2: 'mark'; __proto __: 18, ['Beijing', 'Shanghai'] p1.age = 20; /* อินสแตนซ์ไม่สามารถเปลี่ยนแอตทริบิวต์ค่าพื้นฐานของต้นแบบได้เช่นเดียวกับที่คุณล้างตัดเป่าและย้อมผมสีเหลืองไม่มีส่วนเกี่ยวข้องกับแม่ของคุณ* การทำงานปกติของการเพิ่มแอตทริบิวต์อายุภายใต้อินสแตนซ์ P1 ไม่มีส่วนเกี่ยวข้องกับต้นแบบ เหมือนกับ var o {}; O.AGE = 20 * P1: มีอายุแอตทริบิวต์เพิ่มเติมด้านล่างและ __proto__ เหมือนกับ mother.prototype อายุ = 18 * P2: ชื่อแอตทริบิวต์เท่านั้น __proto__ เหมือนกับ mother.prototype*/p1.home [0] = 'Shenzhen'; /* การแบ่งปันแอตทริบิวต์ประเภทอ้างอิงในต้นแบบเป็นเหมือนที่คุณเผาบ้านของคุณมันกำลังเผาบ้านทั้งครอบครัวของคุณ* นี่เป็นเรื่องเล็กน้อย * P1: 'Jack', 20; __proto __: 18, ['เซินเจิ้น', 'เซี่ยงไฮ้']* P2: 'Mark'; __proto __: 18, ['เซินเจิ้น', 'เซี่ยงไฮ้']*/p1.home = ['หางโจว', 'กวางโจว']; /* ในความเป็นจริงการดำเนินการเดียวกับ p1.age = 20 เปลี่ยนเป็นความเข้าใจนี้: var o {}; O.House = ['Big', 'House']* P1: 'Jack', 20, ['Hangzhou', 'Guangzhou']; __proto __: 18, ['เซินเจิ้น', 'เซี่ยงไฮ้']* P2: 'Mark'; __proto __: 18, ['เซินเจิ้น', 'เซี่ยงไฮ้']*/ลบ P1.age; /* หลังจากลบแอตทริบิวต์ที่กำหนดเองค่าต้นแบบต้นแบบที่เขียนทับเดิมจะถูกตรวจสอบอีกครั้ง นี่คือกลไกการค้นหาที่สูงขึ้นดังนั้นจึงมีพลวัตต่อไปนี้* P1: 'Jack', ['Hangzhou', 'Guangzhou']; __proto __: 18, ['เซินเจิ้น', 'เซี่ยงไฮ้']* P2: 'Mark'; __proto __: 18, ['เซินเจิ้น', 'เซี่ยงไฮ้']*/person.prototype.lastname = 'Jin'; /* เขียนต้นแบบใหม่และตอบสนองต่ออินสแตนซ์แบบไดนามิก เช่นเดียวกับที่แม่ของคุณกลายเป็นคนอินเทรนด์เพื่อนบ้านบอกว่าคุณเป็นบุตรชายของผู้หญิงที่ทันสมัยเมื่อพวกเขาพูดถึงมัน* โปรดทราบว่าเรากำลังเขียนต้นแบบของบุคคลที่นี่ซึ่งคือการเพิ่มแอตทริบิวต์นามสกุลให้กับแม่ซึ่งเทียบเท่ากับแม่ หากคุณเปลี่ยนระดับที่แตกต่างกันเอฟเฟกต์มักจะแตกต่างกันมาก * P1: 'Jack', ['Hangzhou', 'Guangzhou']; __proto __: 'Jin'; __ Proto __: 18, ['Shenzhen', 'Shanghai']* P2: 'Mark'; __proto __: 'Jin'; __ Proto __: 18, ['Shenzhen', 'Shanghai']*/person.prototype = {อายุ: 28, ที่อยู่: {ประเทศ: 'USA', เมือง: 'Washington'}}; /* เขียนต้นแบบใหม่! ในเวลานี้ต้นแบบของบุคคลได้กลายเป็นวัตถุใหม่อย่างสมบูรณ์ซึ่งหมายความว่าบุคคลนั้นเปลี่ยนแม่ของเขา * เพื่อให้เข้าใจเช่นนี้: var a = 10; b = a; a = 20; c = a. ดังนั้น B ยังคงไม่เปลี่ยนแปลงและกลายเป็น C ดังนั้นการเปลี่ยนแปลง P3 และไม่มีส่วนเกี่ยวข้องกับแม่ * P1: 'Jack', ['Hangzhou', 'Guangzhou']; __proto __: 'Jin'; __ Proto __: 18, ['Shenzhen', 'Shanghai']* P2: 'Mark'; __proto __: 'Jin'; __ Proto __: 18, ['Shenzhen', 'Shanghai']* P3: 'Obama'; __ Proto__: 28 {ประเทศ: 'USA', City: 'Washington'}*/Mother.prototype.no = 9527;/* เช่นเดียวกับที่แม่ของคุณกลายเป็นเทรนด์ใหม่เพื่อนบ้านบอกว่าคุณเป็นคุณยายอินเทรนด์* โปรดทราบว่าเรากำลังเขียนใหม่แม่ prototype ที่นี่ p1p2 จะเปลี่ยนไป แต่ P3 ข้างต้นไม่มีอะไรเกี่ยวข้องกับแม่และมันจะไม่ส่งผลกระทบต่อเขา * P1: 'Jack', ['Hangzhou', 'Guangzhou']; __proto __: 'Jin'; __ Proto __: 18, ['Shenzhen', 'Shanghai'], 9527* P2: 'Mark'; __proto __: 'Jin'; __ Proto __: 18, ['Shenzhen', 'Shanghai'], 9527* P3: 'Obama'; __proto__: 28 {ประเทศ: 'สหรัฐอเมริกา', เมือง: 'วอชิงตัน'}*/mother.prototype = {Car: 2, งานอดิเรก: ['Run', 'Walk']}; var p4 = คนใหม่ ('Tony'); ในเวลานี้ต้นแบบของแม่ได้กลายเป็นวัตถุใหม่อย่างสมบูรณ์! * เนื่องจากบุคคลและแม่ถูกตัดการเชื่อมต่อจากด้านบนการเปลี่ยนแปลงของแม่จะไม่ส่งผลกระทบต่อบุคคลอีกต่อไป * P4: 'Tony'; __ Proto__: 28 {ประเทศ: 'USA', เมือง: 'Washington'}*/person.prototype = ใหม่แม่ (); // ผูก var อีกครั้ง p5 = บุคคลใหม่ ('luffy'); // ถ้าคุณต้องการใช้การเปลี่ยนแปลงเหล่านี้ในเวลานี้คุณจะต้องมีต้นแบบของบุคคลใหม่กับแม่ // p5: 'luffy'; __ proto__: 2, ['run', 'walk'] p1 .__ proto __. โมฆะ? Mother .__ Proto __.__ Proto __.__ Proto__ // null คุณคิดว่าจุดสิ้นสุดของห่วงโซ่ต้นแบบไม่ใช่ NULL หรือไม่?คุณสามารถเข้าใจได้โดยทั่วไปหลังจากอ่านมัน?
ทีนี้มาพูดถึงความแตกต่างระหว่าง p1.age = 20, p1.home = ['หางโจว', 'กวางโจว'] และ p1.home [0] = 'เซินเจิ้น' p1.home [0] = 'เซินเจิ้น'; เพื่อสรุปมันเป็นรูปแบบเช่น p1.object.method, p1.object.property
p1.age = 20; p1.home = ['หางโจว', 'กวางโจว']; สองประโยคนี้เข้าใจง่าย ลืมต้นแบบก่อนและคิดเกี่ยวกับวิธีที่เราเพิ่มแอตทริบิวต์ให้กับวัตถุธรรมดา:
var obj = วัตถุใหม่ (); obj.name = 'xxx'; obj.num = [100, 200];
คุณเข้าใจวิธีนี้หรือไม่? มันเหมือนกัน
ถ้าเช่นนั้นทำไม P1.home [0] = 'เซินเจิ้น' สร้างคุณสมบัติอาร์เรย์ในบ้านภายใต้ P1 จากนั้นตั้งตำแหน่งแรกเป็น 'เซินเจิ้น'? มาลืมสิ่งนี้ก่อนคิดเกี่ยวกับวัตถุ OBJ ด้านบน ถ้ามันถูกเขียนเช่นนี้: var obj.name = 'xxx', obj.num = [100, 200] คุณจะได้ผลลัพธ์ที่คุณต้องการได้หรือไม่? เห็นได้ชัดว่าคุณจะไม่ได้อะไรเลยยกเว้นข้อผิดพลาด เพราะ OBJ ยังไม่ได้กำหนดคุณจะเพิ่มบางสิ่งบางอย่างได้อย่างไร? ในทำนองเดียวกันบ้านใน P1.Home [0] ไม่ได้กำหนดภายใต้ P1 ดังนั้นจึงเป็นไปไม่ได้ที่จะกำหนดบ้านโดยตรง [0] หากคุณต้องการสร้างอาร์เรย์ที่บ้านภายใต้ P1 แน่นอนว่ามันถูกเขียนขึ้นเช่นนี้:
p1.home = []; p1.home [0] = 'เซินเจิ้น';
นี่ไม่ใช่วิธีที่ใช้กันมากที่สุดใช่ไหม
เหตุผลที่ p1.home [0] = 'เซินเจิ้น' ไม่ได้รายงานข้อผิดพลาดโดยตรงเพราะมีกลไกการค้นหาในห่วงโซ่ต้นแบบ เมื่อเราป้อน P1.Object กลไกการค้นหาของห่วงโซ่ต้นแบบคือการค้นหาค่าที่สอดคล้องกันในอินสแตนซ์ก่อน หากไม่พบมันจะถูกค้นหาในต้นแบบ หากไม่พบมันจะค้นหาในระดับก่อนหน้าของห่วงโซ่ต้นแบบ ... มันจะถึงจุดสิ้นสุดของห่วงโซ่ต้นแบบนั่นคือถ้ายังไม่พบมันจะกลับมาที่ไม่ได้กำหนด เมื่อเราป้อน P1.Home [0] กลไกการค้นหาเดียวกันก็เป็นจริงเช่นกัน ค้นหา P1 ก่อนเพื่อดูว่ามีคุณลักษณะและวิธีการใด ๆ ที่ชื่อว่า Home หรือไม่จากนั้นค้นหาทีละขั้นตอน ในที่สุดเราก็พบมันในต้นแบบของแม่ดังนั้นการปรับเปลี่ยนมันเทียบเท่ากับการปรับเปลี่ยนต้นแบบของแม่
โดยสรุป: p1.home [0] = 'เซินเจิ้น' เทียบเท่ากับ mother.prototype.home [0] = 'เซินเจิ้น'
จากการวิเคราะห์ข้างต้นเราจะเห็นว่าปัญหาหลักของการสืบทอดโซ่ต้นแบบอยู่ในการแบ่งปันคุณลักษณะ หลายครั้งที่เราต้องการแบ่งปันวิธีการ แต่ไม่ใช่คุณลักษณะ ตามหลักการแล้วแต่ละอินสแตนซ์ควรมีคุณลักษณะอิสระ ดังนั้นจึงมีสองวิธีในการปรับปรุงการสืบทอดต้นแบบ:
1) มรดกแบบรวมกัน
ฟังก์ชั่นแม่ (อายุ) {this.age = อายุ; this.hobby = ['วิ่ง', 'ฟุตบอล']} mother.prototype.showage = function () {console.log (this.age); }; ฟังก์ชั่นบุคคล (ชื่อ, อายุ) {mother.call (นี่, อายุ); // การดำเนินการครั้งที่สอง this.name = name; } person.prototype = new Mother (); // First Execution Person.prototype.constructor = person; person.prototype.showname = function () {console.log (this.name);} var p1 = บุคคลใหม่ ('jack', 20); p1.hobby.push ('บาสเก็ตบอล'); // P1: 'Jack'; __proto __: 20, ['วิ่ง', 'ฟุตบอล'] var p2 = บุคคลใหม่ ('mark', 18); // p2: 'mark'; __proto __: 18, ['วิ่ง', 'ฟุตบอล']ผลที่ได้คือสีม่วง:
เมื่อดำเนินการครั้งแรกที่นี่คุณจะได้รับ person.prototype.age = undefined, person.prototype.hobby = ['Running', 'Football'] การดำเนินการครั้งที่สองคือ var p1 = บุคคลใหม่ ('แจ็ค', 20) และคุณจะได้รับ p1.age = 20, p1.hobby = ['วิ่ง', 'ฟุตบอล'] หลังจากผลักดันมันจะกลายเป็น p1.hobby = ['วิ่ง', 'ฟุตบอล', 'บาสเก็ตบอล'] ในความเป็นจริงมันค่อนข้างง่ายที่จะเข้าใจการเปลี่ยนแปลงของสิ่งนี้ คุณสามารถรับผลลัพธ์นี้ได้เพียงแค่แทนที่สิ่งนี้ หากคุณรู้สึกว่ามันค่อนข้างสับสนที่จะเข้าใจลองทิ้งแนวคิดในใจของคุณและดำเนินการรหัสจากบนลงล่างเป็นเบราว์เซอร์ มันจะออกมา?
โดยการดำเนินการตัวสร้างต้นแบบแม่ () เป็นครั้งที่สองเราคัดลอกสำเนาคุณสมบัติของต้นแบบในอินสแตนซ์ของวัตถุเพื่อให้เราสามารถแยกและแยกออกจากคุณสมบัติต้นแบบ หากคุณระมัดระวังคุณจะพบว่าครั้งแรกที่เราเรียกว่าแม่ () ดูเหมือนว่าไม่มีประโยชน์ เราจะไม่เรียกมันได้อย่างไร? ใช่มีการสืบทอดการรวมกันของปรสิตต่อไปนี้
2) การสืบทอดการรวมกันของกาฝาก
ฟังก์ชั่นวัตถุ (o) {ฟังก์ชั่น f () {} f.prototype = o; return ใหม่ f ();} ฟังก์ชั่นสืบทอดข้อมูลมรดก (บุคคล, แม่) {var prototype = object (mother.prototype); Prototype.Constructor = บุคคล; person.prototype = ต้นแบบ; } ฟังก์ชั่นแม่ (อายุ) {this.age = อายุ; this.hobby = ['running', 'football']} mother.prototype.showage = function () {console.log (this.age); }; ฟังก์ชั่นบุคคล (ชื่อ, อายุ) {mother.call (นี่, อายุ); this.name = ชื่อ; } มดลูกมดลูก (บุคคล, แม่); person.prototype.showname = function () {console.log (this.name);} var p1 = บุคคลใหม่ ('jack', 20); p1.hobby.push ('บาสเก็ตบอล'); // p1: 'แจ็ค'; __proto __: 20, ['วิ่ง', 'ฟุตบอล'] var p2 = บุคคลใหม่ ('mark', 18); // p2: 'mark'; __proto __: 18, ['วิ่ง', 'ฟุตบอล']ผลที่ได้คือสีม่วง:
ไม่มีคุณลักษณะอายุและงานอดิเรกอีกต่อไปในต้นแบบมีเพียงสองวิธีเท่านั้นซึ่งเป็นผลลัพธ์ที่เราต้องการ!
จุดสำคัญคือในวัตถุ (O) ซึ่งวัตถุชั่วคราวถูกยืมมาที่นี่เพื่อหลีกเลี่ยงการเรียกแม่ใหม่ () อย่างชาญฉลาดจากนั้นส่งคืนอินสแตนซ์วัตถุใหม่ด้วยต้นแบบ O ดังนั้นจึงทำการตั้งค่าของห่วงโซ่ต้นแบบ มันสับสนมากใช่มั้ย นั่นเป็นเพราะเราไม่สามารถตั้งค่าบุคคลได้ prototype = mother.prototype โดยตรง
สรุป
-
ต้องพูดมากจริง ๆ แล้วมีเพียงแกนเดียวเท่านั้น: การแบ่งปันแอตทริบิวต์และการควบคุมอิสระ เมื่ออินสแตนซ์วัตถุของคุณต้องการแอตทริบิวต์อิสระสาระสำคัญของการปฏิบัติทั้งหมดคือการสร้างแอตทริบิวต์ในอินสแตนซ์ของวัตถุ หากคุณไม่คิดมากเกินไปคุณสามารถกำหนดคุณลักษณะอิสระที่คุณต้องการโดยตรงเพื่อเขียนทับคุณสมบัติของต้นแบบ ในระยะสั้นเมื่อใช้การสืบทอดต้นแบบคุณควรให้ความสนใจเป็นพิเศษกับคุณลักษณะในต้นแบบเพราะพวกเขาทั้งหมดมีอยู่ทั้งหมดที่ส่งผลกระทบต่อร่างกายทั้งหมด
ด้านล่างนี้เป็นรายการวิธีการต่าง ๆ อย่างง่ายสำหรับการสร้างวัตถุใน JS วิธีที่ใช้กันมากที่สุดในขณะนี้คือโหมดการรวมกัน นักเรียนที่คุ้นเคยสามารถข้ามไปยังจุดสิ้นสุดของบทความและชอบมัน
1) โหมดดั้งเดิม
// 1. โหมดดั้งเดิม, โหมดตัวอักษรออบเจ็กต์บุคคล var person = {ชื่อ: 'jack', อายุ: 18, sayname: function () {alert (this.name); }}; // 1 โหมดดั้งเดิมโหมดตัวสร้างวัตถุ var person = new Object (); person.name = 'jack'; person.age = 18; person.sayname = function () {Alert (this.name);};เห็นได้ชัดว่าเมื่อเราต้องการสร้างแบทช์ของ person1, person2 ... เราต้องพิมพ์รหัสจำนวนมากทุกครั้งและแม้แต่ copypasters อาวุโสก็ไม่สามารถยืนได้! จากนั้นก็มีแบบจำลองโรงงานของการผลิตจำนวนมาก
2) แบบจำลองโรงงาน
// 2. โหมดโรงงานกำหนดฟังก์ชั่นเพื่อสร้างฟังก์ชั่นวัตถุ createperson (ชื่ออายุ) {var temp = new Object (); person.name = name; person.age = age; person.sayname = function () {Alert (this.name);}; return temp; -โหมดโรงงานคือการผลิตจำนวนมากและคุณสามารถเข้าสู่โหมดการสร้างผู้ชายด้วยการโทรง่าย ๆ (papapapa ... ) คุณสามารถสร้างกลุ่มทารกได้โดยการระบุชื่อและอายุของคุณและปลดปล่อยมือของคุณ อย่างไรก็ตามเนื่องจากดำเนินการในโรงงานคุณจึงไม่สามารถระบุประเภทของวัตถุได้ไม่ว่าจะเป็นมนุษย์หรือสุนัข (การทดสอบอินสแตนซ์ของวัตถุ) นอกจากนี้ทุกครั้งที่คุณสร้างมนุษย์คุณต้องสร้างวัตถุอุณหภูมิอิสระรหัสจะป่องและผีเสื้อก็สง่างาม
3) ตัวสร้าง
// 3. โหมดคอนสตรัคเตอร์กำหนดฟังก์ชั่นคอนสตรัคเตอร์สำหรับคนฟังก์ชั่นวัตถุ (ชื่ออายุ) {this.name = name; this.age = age; this.sayname = function () {Alert (this.name);}; } var p1 = คนใหม่ ('jack', 18); // สร้างบุคคลวัตถุ P1 ('Jack', 18); // เมธอดแอตทริบิวต์จะถูกมอบให้กับวัตถุหน้าต่าง, window.name = 'jack', window.sayname () จะส่งออกแจ็คตัวสร้างมีความคล้ายคลึงกับตัวสร้างคลาสใน C ++ และ Java และเข้าใจง่าย นอกจากนี้บุคคลสามารถใช้เป็นการจดจำประเภท (การทดสอบอินสแตนซ์ของบุคคลและวัตถุ) อย่างไรก็ตามทุกกรณียังคงเป็นอิสระและวิธีการของอินสแตนซ์ที่แตกต่างกันเป็นฟังก์ชั่นที่แตกต่างกัน ลืมฟังก์ชั่นคำที่นี่เพียงถือว่าชื่อ Sayname เป็นวัตถุและเข้าใจ กล่าวคือชื่อ Sayname ของจางซานและชื่อของ Li Si มีการดำรงอยู่ที่แตกต่างกัน แต่เห็นได้ชัดว่าสิ่งที่เราคาดหวังคือการแบ่งปันชื่อ Sayname เพื่อบันทึกความทรงจำ
4) โหมดต้นแบบ
// 4. โหมดต้นแบบกำหนดฟังก์ชันแอตทริบิวต์ต้นแบบโดยตรง () {} person.prototype.name = 'jack'; person.prototype.age = 18; person.prototype.sayname = function () {แจ้งเตือน (this.name); }; // 4 Prototype, วิธีการนิยามตัวอักษรฟังก์ชัน Person () {} person.prototype = {ชื่อ: 'jack', อายุ: 18, sayname: function () {alert (this.name); }}; var p1 = บุคคลใหม่ (); // name = 'jack'var p2 = คนใหม่ (); // name = 'jack'สิ่งที่ต้องสังเกตที่นี่คือการแบ่งปันแอตทริบิวต์ต้นแบบและวิธีการนั่นคือทุกอินสแตนซ์ทั้งหมดอ้างถึงวิธีการใช้แอตทริบิวต์ในต้นแบบและการเปลี่ยนแปลงที่เกิดขึ้นในสถานที่ใด ๆ จะทำให้เกิดการเปลี่ยนแปลงในกรณีอื่น ๆ
5) โหมดผสม (การก่อสร้าง + ต้นแบบ)
// 5. Prototype Construct Mode, Function Person (ชื่อ, อายุ) {this.name = name; this.age = อายุ;} person.prototype = {Hobby: ['Running', 'Football']; sayname: function () {แจ้งเตือน (this.name); }, sayage: function () {Alert (this.age); }}; var p1 = บุคคลใหม่ ('jack', 20); // P1: 'Jack', 20; __proto__: ['วิ่ง', 'ฟุตบอล'], sayname, sayagevar p2 = บุคคลใหม่ ('mark', 18); // p1: 'mark', 18; __ proto__: ['วิ่ง', 'ฟุตบอล'], sayname, sayageวิธีการคือการวางวิธีการอสังหาริมทรัพย์ที่ต้องเป็นอิสระในตัวสร้างและชิ้นส่วนที่สามารถใช้ร่วมกันได้จะถูกวางลงในต้นแบบ สิ่งนี้สามารถเพิ่มการประหยัดหน่วยความจำในขณะที่รักษาความเป็นอิสระของอินสแตนซ์วัตถุ