ตัวสร้างในจาวาสคริปต์ก็แตกต่างจากภาษาอื่น ๆ ฟังก์ชั่นใด ๆ ที่เรียกผ่านคำหลักใหม่ถือได้ว่าเป็นตัวสร้าง
ภายในตัวสร้างตัวสร้างสิ่งนี้ชี้ไปที่วัตถุที่สร้างขึ้นใหม่ หากไม่มีนิพจน์ส่งคืนที่แสดงในตัวสร้างตัวสร้างเราจะส่งคืนสิ่งนี้โดยค่าเริ่มต้นนั่นคือวัตถุที่สร้างขึ้นใหม่
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น foo () {
this.bla = 1;
-
foo.prototype.test = function () {
console.log (this.bla);
-
test var = new foo ();
รหัสด้านบนเรียกว่า foo เป็นตัวสร้างและชี้ต้นแบบของวัตถุที่สร้างขึ้นใหม่ (__proto__) ไปที่ foo.prototype
หากเรากำหนดนิพจน์ที่ส่งคืนในตัวสร้างคอนสตรัคเตอร์จะส่งคืนนิพจน์ทั้งหมด แต่นิพจน์การส่งคืนนี้จะต้องเป็นวัตถุ
การคัดลอกรหัสมีดังนี้:
แถบฟังก์ชัน () {
กลับ 2;
-
ใหม่บาร์ (); // วัตถุใหม่
ฟังก์ชั่นทดสอบ () {
this.value = 2;
กลับ {
Foo: 1
-
-
การทดสอบใหม่ (); // วัตถุที่ส่งคืน
หากถูกละเว้นใหม่ฟังก์ชั่นไม่สามารถส่งคืนวัตถุใหม่ได้
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น foo () {
this.bla = 1; // ได้รับการตั้งค่าบนวัตถุทั่วโลก
-
foo (); // ไม่ได้กำหนด
ตัวอย่างข้างต้นอาจใช้งานได้ในบางสถานการณ์ แต่เนื่องจากกลไกการทำงานของสิ่งนี้ใน JavaScript สิ่งนี้จะชี้ไปที่วัตถุระดับโลกที่นี่
รูปแบบโรงงาน
เพื่อให้สามารถใช้คำหลักใหม่ตัวสร้างจะต้องแสดงค่าส่งคืน
การคัดลอกรหัสมีดังนี้:
แถบฟังก์ชัน () {
ค่า var = 1;
กลับ {
วิธี: ฟังก์ชัน () {
ค่าส่งคืน;
-
-
-
bar.prototype = {
foo: function () {}
-
ใหม่บาร์ ();
บาร์();
ในตัวอย่างข้างต้นเอฟเฟกต์ของการเรียกแถบฟังก์ชั่นโดยไม่ต้องใช้ใหม่นั้นเหมือนกันและวัตถุที่สร้างขึ้นใหม่ที่มีวิธีการจะถูกส่งกลับซึ่งจริง ๆ แล้วเป็นการปิด
สิ่งหนึ่งที่ควรทราบที่นี่คือแถบใหม่ () จะไม่คืนบาร์ prototype แต่จะเป็นวัตถุต้นแบบของวิธีการทำงานภายในนิพจน์การส่งคืนแทน
ในตัวอย่างข้างต้นไม่มีความแตกต่างในการใช้งานระหว่างการใช้ใหม่หรือไม่
สร้างวัตถุใหม่ผ่านโหมดโรงงาน
เรามักจะเตือนว่าจะไม่ใช้ใหม่เพราะเมื่อคุณลืมการใช้งานแล้วมันจะทำให้เกิดข้อผิดพลาด
ในการสร้างวัตถุเราต้องการใช้รูปแบบโรงงานและสร้างวัตถุใหม่ภายในรูปแบบโรงงาน
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น foo () {
var obj = {};
obj.value = 'blub';
var ส่วนตัว = 2;
obj.somemethod = ฟังก์ชั่น (ค่า) {
this.value = ค่า;
-
obj.getPrivate = function () {
กลับส่วนตัว;
-
คืน OBJ;
-
แม้ว่ารหัสตัวอย่างข้างต้นมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยกว่าเมื่อใช้ใหม่และจะสะดวกกว่าเมื่อใช้ตัวแปรส่วนตัว แต่ก็มีข้อเสียบางประการ:
เนื่องจากวัตถุต้นแบบไม่สามารถแชร์ได้จึงจำเป็นต้องใช้หน่วยความจำมากขึ้น
เพื่อให้บรรลุการสืบทอดรูปแบบโรงงานจำเป็นต้องคัดลอกวิธีการทั้งหมดของวัตถุอื่นหรือใช้เป็นต้นแบบของวัตถุใหม่
การเลิกใช้ห่วงโซ่ต้นแบบเป็นเพียงการหลีกเลี่ยงการใช้ใหม่ซึ่งดูเหมือนจะตรงกันข้ามกับจิตวิญญาณของภาษาจาวาสคริปต์
สรุป
แม้ว่าการใช้ใหม่อาจมีแนวโน้มที่จะเกิดข้อผิดพลาดมากขึ้น แต่นี่ไม่ใช่เหตุผลที่จะละทิ้งการใช้งานเครือข่ายต้นแบบ สำหรับวิธีการที่จะใช้ในที่สุดมันขึ้นอยู่กับความต้องการของแอปพลิเคชัน วิธีที่ดีที่สุดคือการเลือกสไตล์และยึดติดกับมัน
เพียงแค่ใส่ตัวสร้างคือการเริ่มต้นวัตถุอินสแตนซ์และคุณสมบัติต้นแบบของวัตถุสืบทอดวัตถุอินสแตนซ์