เรารู้ว่า JS นั้นมุ่งเน้นไปที่วัตถุ เมื่อพูดถึงการวางแนววัตถุมันเป็นสิ่งที่หลีกเลี่ยงไม่ได้ที่จะเกี่ยวข้องกับแนวคิดของชั้นเรียน โดยทั่วไปภาษาที่พิมพ์อย่างมากเช่น C# และ Java ได้แก้ไขไวยากรณ์เพื่อกำหนดคลาส ความแตกต่างระหว่าง JS คือสามารถใช้วิธีการต่าง ๆ เพื่อใช้คลาสและวัตถุของตัวเอง มีวิธีการดำเนินการทั่วไปหลายวิธี:
1. วิธีโรงงาน
วิธีการโรงงานหมายถึงการสร้างฟังก์ชั่นโรงงานที่ส่งคืนประเภทวัตถุเฉพาะ
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น CreateCar (Scolor, Idoors, IMPG)
-
var otempcar = วัตถุใหม่;
OTEMPCAR.COLOR = SCOLOR;
OTEMPCAR.DOORS = IDOORS;
otempcar.mpg = impg;
otempcar.showColor = ฟังก์ชั่น ()
-
การแจ้งเตือน (this.color);
-
กลับ otempcar;
-
var ocar1 = createCar ("สีแดง", 4,23);
var ocar2 = createCar ("สีน้ำเงิน", 3,25);
ocar1.showcolor ();
ocar2.showcolor ();
ด้วยวิธีนี้ทุกครั้งที่เรียกใช้ฟังก์ชันโรงงานวัตถุใหม่จะถูกสร้างขึ้น แต่ปัญหาคือทุกครั้งที่มีการสร้างวัตถุใหม่ฟังก์ชั่นใหม่จะต้องสร้างขึ้นซึ่งทำให้แต่ละวัตถุมีการแสดงของตัวเองและในความเป็นจริงวัตถุทั้งหมดแบ่งปันฟังก์ชั่นเดียวกัน เป็นวิธีการของวัตถุที่กำหนดไว้นอกฟังก์ชั่นโรงงานหรือไม่จากนั้นวัตถุจะได้รับตัวชี้ไปยังฟังก์ชันดังนี้
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น Showcolor ()
-
การแจ้งเตือน (this.color);
-
ฟังก์ชั่น CreateCar (Scolor, Idoors, IMPG)
-
var otempcar = วัตถุใหม่;
OTEMPCAR.COLOR = SCOLOR;
OTEMPCAR.DOORS = IDOORS;
otempcar.mpg = impg;
OTEMPCAR.SHOWCOLOR = SHOWCOLOR;
กลับ otempcar;
-
var ocar1 = createCar ("สีแดง", 4,23);
var ocar2 = createCar ("สีน้ำเงิน", 3,25);
ocar1.showcolor ();
ocar2.showcolor ();
ด้วยวิธีนี้ไม่จำเป็นต้องสร้างฟังก์ชั่น ShowColor ของตัวเองสำหรับแต่ละวัตถุ แต่เพียงสร้างตัวชี้ไปยังฟังก์ชั่นนี้ ดังนั้นจึงมีการแนะนำวิธีตัวสร้าง
2. วิธีตัวสร้าง
ตัวสร้างมีความคล้ายคลึงกับฟังก์ชั่นโรงงานโค้ดตัวอย่างมีดังนี้:
การคัดลอกรหัสมีดังนี้:
Function Car (Scolor, Idoors, IMPG)
-
this.color = Scolor;
this.doors = Idoors;
this.mpg = impg;
this.showColor = function ()
-
การแจ้งเตือน (this.color);
-
-
var ocar1 = รถใหม่ ("สีแดง", 4,23);
var ocar2 = รถใหม่ ("สีน้ำเงิน", 3,25);
ในตัวสร้างไม่มีวัตถุที่สร้างขึ้นภายใน แต่คำหลักที่ใช้นี้ใช้ เมื่อเรียกตัวสร้างโดยใช้ตัวดำเนินการใหม่วัตถุจะถูกสร้างขึ้นก่อนที่จะเรียกใช้รหัสบรรทัดแรกเท่านั้น แต่เห็นได้ชัดว่ามีปัญหาอะไรบ้าง? เพื่อแก้ปัญหานี้ได้มีการแนะนำวิธีต้นแบบต่อไปนี้
3. วิธีการต้นแบบ
วิธีนี้ใช้ประโยชน์จากคุณสมบัติต้นแบบของวัตถุซึ่งถือได้ว่าเป็นต้นแบบที่วัตถุใหม่ขึ้นอยู่กับ ที่นี่ใช้ตัวสร้างที่ว่างเปล่าเพื่อตั้งชื่อคลาส จากนั้นวิธีการและแอตทริบิวต์ทั้งหมดจะถูกกำหนดโดยตรงไปยังแอตทริบิวต์ต้นแบบ ดังนี้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นรถ ()
-
car.prototype.color = "สีแดง";
car.prototype.doors = 4;
car.prototype.mpg = 23;
car.prototype.drivers = new Array ("Mike", "Sue");
car.prototype.showcolor = function ()
-
การแจ้งเตือน (this.color);
-
วิธีการต้นแบบสามารถกำหนดค่าได้โดยตรงและไม่สามารถส่งผ่านพารามิเตอร์ไปยังตัวสร้างค่าของการเริ่มต้นแอตทริบิวต์ เมื่อใช้วิธีนี้คุณจะพบปัญหาสองประการ ปัญหาแรกคือแต่ละวัตถุจะต้องถูกสร้างขึ้นก่อนที่ค่าเริ่มต้นของแอตทริบิวต์จะสามารถเปลี่ยนแปลงได้ด้วยวิธีนี้ เป็นไปไม่ได้ที่จะมีค่าคุณสมบัติโดยตรงที่คุณต้องการเมื่อสร้างแต่ละวัตถุ สิ่งนี้น่ารำคาญ ปัญหาที่สองคือเมื่อแอตทริบิวต์หมายถึงวัตถุ จะไม่มีปัญหาเกี่ยวกับการแบ่งปันฟังก์ชั่น แต่จะมีปัญหากับการแบ่งปันวัตถุ เพราะแต่ละอินสแตนซ์จำเป็นต้องใช้วัตถุของตัวเอง
ดังนี้:
การคัดลอกรหัสมีดังนี้:
var ocar1 = รถใหม่ ();
var ocar2 = รถใหม่ ();
ocar1.drivers.push ("Matt");
การแจ้งเตือน (ocar1.drivers); // output "Mike, Sue, Matt"
การแจ้งเตือน (ocar2.drivers); // output "Mike, Sue, Matt"
ดังนั้นแอตทริบิวต์ไดรเวอร์จึงเป็นเพียงตัวชี้ไปยังวัตถุดังนั้นอินสแตนซ์ทั้งหมดจึงแบ่งปันวัตถุเดียวกัน เนื่องจากปัญหาเหล่านี้เราจึงแนะนำวิธีการใช้งานร่วมและวิธีการสร้างต้นแบบต่อไปนี้
4. วิธีการสร้าง/ต้นแบบคอนสตรัคเตอร์ผสม
แนวคิดของวิธีนี้คือการใช้ตัวสร้างเพื่อกำหนดคุณสมบัติที่ไม่ใช้งานทั้งหมดของวัตถุ (รวมถึงคุณสมบัติทั่วไปและคุณสมบัติที่ชี้ไปที่วัตถุ) และใช้ต้นแบบเพื่อกำหนดคุณสมบัติฟังก์ชัน (วิธีการ) ของวัตถุ ผลลัพธ์คือฟังก์ชั่นทั้งหมดถูกสร้างขึ้นเพียงครั้งเดียวและแต่ละวัตถุมีอินสแตนซ์แอตทริบิวต์วัตถุของตัวเอง รหัสตัวอย่างมีดังนี้:
การคัดลอกรหัสมีดังนี้:
Function Car (Scolor, Idoors, IMPG)
-
this.color = Scolor;
this.doors = Idoors;
this.mpg = impg;
this.divers = new Array ("Mike", "Sue");
-
car.prototype.showcolor = function ()
-
การแจ้งเตือน (this.color);
-
var ocar1 = รถใหม่ ("สีแดง", 4,23);
var ocar2 = รถใหม่ ("สีน้ำเงิน", 3,25);
ocar1.drivers.push ("Matt");
การแจ้งเตือน (ocar1.drivers); // output "Mike, Sue, Matt"
การแจ้งเตือน (ocar2.drivers); // output "Mike, Sue"
ดังที่เห็นได้จากรหัสตัวอย่างวิธีนี้จะแก้ปัญหาสองอย่างในวิธีก่อนหน้าในเวลาเดียวกัน อย่างไรก็ตามด้วยวิธีนี้นักพัฒนาบางคนยังรู้สึกว่ามันไม่สมบูรณ์แบบ
5. วิธีการต้นแบบแบบไดนามิก
เราจะเห็นว่าภาษาที่เน้นวัตถุส่วนใหญ่ห่อหุ้มคุณสมบัติและวิธีการทางสายตา อย่างไรก็ตามวิธีการแสดงสีในวิธีข้างต้นถูกกำหนดนอกชั้นเรียน ดังนั้นพวกเขาจึงออกแบบวิธีการต้นแบบแบบไดนามิก แนวคิดพื้นฐานของวิธีการนี้เหมือนกับวิธีการสร้างแบบผสม/ต้นแบบความแตกต่างเพียงอย่างเดียวคือที่ตั้งของวิธีวัตถุ ดังที่แสดงด้านล่าง:
การคัดลอกรหัสมีดังนี้:
Function Car (Scolor, Idoors, IMPG)
-
this.color = Scolor;
this.doors = Idoors;
this.mpg = impg;
this.divers = new Array ("Mike", "Sue");
if (typeof car._initialized == "undefined"))
-
car.prototype.showcolor = function ()
-
การแจ้งเตือน (this.color);
-
-
car._initialized = true;
-
วิธีนี้ car.prototype.showcolor ถูกสร้างขึ้นเพียงครั้งเดียว การพึ่งพานี้ทำให้รหัสนี้เป็นเหมือนคำจำกัดความของคลาสในภาษาอื่น ๆ
6. วิธีการผสมจากโรงงาน
วิธีการนี้มักจะเป็นวิธีแก้ปัญหาที่ไม่สามารถใช้เป็นวิธีการเดิมได้ จุดประสงค์คือการสร้างตัวสร้างปลอมที่ส่งคืนเฉพาะอินสแตนซ์ใหม่ของวัตถุอื่น
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น createCar ()
-
var otempcar = วัตถุใหม่;
otempcar.color = "สีแดง";
otempcar.doors = 4;
otempcar.mpg = 23;
otempcar.showColor = ฟังก์ชั่น ()
-
การแจ้งเตือน (this.color);
-
กลับ otempcar;
-
var car = รถใหม่ ();
เนื่องจากตัวดำเนินการใหม่ถูกเรียกภายในตัวสร้างรถยนต์ () ตัวสร้างใหม่ผู้ให้บริการรายที่สองจึงถูกละเว้นโดยอัตโนมัติ วัตถุที่สร้างขึ้นภายในคอนสตรัคเตอร์จะถูกส่งกลับไปยังตัวแปร var วิธีการนี้มีปัญหาเช่นเดียวกับวิธีการคลาสสิกในแง่ของการจัดการภายในของวิธีการวัตถุ ดังนั้นจึงขอแนะนำอย่างยิ่ง: หลีกเลี่ยงการใช้วิธีนี้เว้นแต่จะจำเป็นอย่างยิ่ง