มีหลายวิธีทั่วไปในการกำหนดคลาสหรืออ็อบเจ็กต์ใน JavaScript: แนวทางโรงงาน
ฟังก์ชั่น createCar (สี, ประตู, mpg) {
var tempCar = วัตถุ ใหม่ ;
tempCar.color = สี;
tempCar.doors = ประตู;
tempCar.mpg = mpg;
tempCar.showColor = ฟังก์ชั่น (){
การแจ้งเตือน ( .color นี้ );
-
กลับ tempCar;
-
var car1 = createCar("สีแดง", 4, 23);
var car2 = createCar("สีน้ำเงิน", 3, 25);
car1.showColor();
car2.showColor();
กำหนดฟังก์ชั่นโรงงานที่สามารถสร้างและส่งคืนวัตถุประเภทเฉพาะได้ ดูดี แต่มีปัญหาเล็กน้อย จะต้องสร้างฟังก์ชั่นใหม่ showColor ทุกครั้งที่เรียกใช้ ฟังก์ชั่น showColor(){ การแจ้งเตือน (this.color); - ชี้ไปที่ฟังก์ชั่นโรงงานโดยตรง tempCar.showColor = showColor; วิธีนี้จะหลีกเลี่ยงปัญหาในการสร้างฟังก์ชันซ้ำๆ แต่ดูไม่เหมือนวิธีอ็อบเจ็กต์ โหมดตัวสร้าง
ฟังก์ชั่น รถยนต์ (sColor, iDoors, iMpg) {
นี้ .color = sColor;
นี้ .doors = iDoors;
นี้ .mpg = iMpg;
นี้ .showColor = ฟังก์ชั่น (){
การแจ้งเตือน ( .color นี้ );
-
-
var car1 = รถ ใหม่ ("สีแดง", 4, 23);
var car2 = รถ ใหม่ ("สีน้ำเงิน", 3, 25);
car1.showColor();
car2.showColor();
คุณสามารถเห็นความแตกต่างจากวิธีแรก ไม่มีการสร้างวัตถุภายใน Constructor แต่ใช้คีย์เวิร์ดนี้ เมื่อเรียก Constructor โดยใช้ new วัตถุจะถูกสร้างขึ้นก่อนแล้วจึงเข้าถึงได้โดยใช้สิ่งนี้ การใช้งานนี้คล้ายกับภาษาเชิงวัตถุอื่นๆ มาก แต่วิธีนี้มีปัญหาเช่นเดียวกับวิธีก่อนหน้า ซึ่งก็คือการสร้างฟังก์ชันซ้ำๆ วิธีสร้างแบบผสม/ต้นแบบในการสร้าง
วิธีนี้คือการใช้วิธีคอนสตรัคเตอร์และวิธีต้นแบบพร้อมกัน ฟังก์ชั่น รถยนต์ () {
-
Car.prototype.color = "สีแดง";
รถ.ต้นแบบ.ประตู = 4;
รถต้นแบบ.mpg = 23;
Car.prototype.showColor = ฟังก์ชั่น (){
การแจ้งเตือน ( .color นี้ );
-
var car1 = รถ ใหม่ ();
var car2 = รถ ใหม่ ();
ขั้นแรก Constructor Car ถูกกำหนดโดยไม่มีโค้ดใดๆ จากนั้นคุณสมบัติจะถูกเพิ่มผ่านต้นแบบ ข้อได้เปรียบ: ก. อินสแตนซ์ทั้งหมดจัดเก็บพอยน์เตอร์เพื่อแสดงสี ซึ่งแก้ปัญหาการสร้างฟังก์ชันซ้ำๆ ข คุณสามารถใช้ instanceof เพื่อตรวจสอบประเภทวัตถุได้ การแจ้งเตือน (อินสแตนซ์ car1 ของรถยนต์); //true ข้อเสีย เพิ่มรหัสต่อไปนี้:
Car.prototype.drivers = อาร์เรย์ใหม่ ("ไมค์", "ฟ้อง");
car1.drivers.push("ด้าน");
การแจ้งเตือน (car1.drivers); // ส่งออก "ไมค์, ซู, แมตต์"
การแจ้งเตือน (car2.drivers); // ส่งออก "ไมค์, ซู, แมตต์"
ไดรเวอร์เป็นตัวชี้ไปยังวัตถุ Array และทั้งสองอินสแตนซ์ของ Car ชี้ไปที่อาร์เรย์เดียวกัน
ใช้วิธีการผสมดังต่อไปนี้: ฟังก์ชั่น รถยนต์ (sColor, iDoors, iMpg) {
นี้ .color = sColor;
นี้ .doors = iDoors;
นี้ .mpg = iMpg;
นี้ .drivers = new Array("mike", "sue");
-
Car.prototype.showColor = ฟังก์ชั่น (){
การแจ้งเตือน ( .color นี้ );
-
var car1 = รถ ใหม่ ("สีแดง", 4, 23);
var car2 = รถ ใหม่ ("สีน้ำเงิน", 3, 25);
car1.drivers.push("ด้าน");
การแจ้งเตือน (car1.drivers);
การแจ้งเตือน (car2.drivers);
ด้วยวิธีนี้จะไม่มีปัญหา และคุณยังสามารถใช้ instanceof ได้อีกด้วย การสร้างต้นแบบแบบไดนามิก
ฟังก์ชั่น รถยนต์ (sColor, iDoors, iMpg) {
นี้ .color = sColor;
นี้ .doors = iDoors;
นี้ .mpg = iMpg;
นี้ .drivers = new Array("mike", "sue");
ถ้า ( typeof Car.initialized == "ไม่ได้กำหนด"){
Car.prototype.showColor = ฟังก์ชั่น (){
การแจ้งเตือน ( .color นี้ );
-
Car.initialized = จริง ;
-
-
var car1 = รถ ใหม่ ("สีแดง", 4, 23);
var car2 = รถ ใหม่ ("สีน้ำเงิน", 3, 25);
car1.drivers.push("ด้าน");
การแจ้งเตือน (car1.drivers);
การแจ้งเตือน (car2.drivers);
วิธีนี้เป็นวิธีที่ฉันชอบ คำจำกัดความของคลาสทั้งหมดจะเสร็จสมบูรณ์ในฟังก์ชัน ดูเหมือนว่าคำจำกัดความของคลาสในภาษาอื่น ๆ จะไม่ถูกสร้างขึ้นซ้ำ ๆ