ใน JavaScript คลาสสามารถใช้ในการใช้การเขียนโปรแกรมเชิงวัตถุ อย่างไรก็ตามคลาสใน JavaScript นั้นแตกต่างจากใน Java และคำจำกัดความและการใช้งานที่สอดคล้องกันก็แตกต่างกันเช่นกัน
คำจำกัดความของคลาสใน JavaScript
ใน JavaScript วัตถุทั้งหมดที่ได้มาจากวัตถุต้นแบบเดียวกัน (ต้นแบบ) ก่อตัวเป็นคลาส นั่นคือคลาสใน JavaScript เป็นแนวคิดของการรวบรวมวัตถุ หากวัตถุสองชิ้นมีต้นแบบเดียวกันพวกเขาจะอยู่ในคลาสเดียวกัน คลาสใน JavaScript ไม่ต้องการชื่อคลาส รหัสต่อไปนี้เป็นตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
var p = {x: 42};
var a = object.create (p);
var b = object.create (p);
console.log (a === b); // false
console.log (object.getPrototypeof (a) === Object.getPrototypeof (b)); // true
ในตัวอย่างข้างต้นวัตถุ A และ B มีวัตถุต้นแบบเดียวกัน (ต้นแบบ) P ดังนั้น A และ B เป็นของคลาสเดียวกัน (แม้ว่าคลาสนี้จะไม่มีชื่อคลาส) และพวกเขาได้รับมรดกคุณสมบัติ X ด้วยค่า 42 จากวัตถุต้นแบบ p
จากตัวอย่างนี้เราจะเห็นได้ว่าฟังก์ชั่นของวัตถุต้นแบบนั้นเทียบเท่ากับเทมเพลตและสามารถสร้าง/สร้างวัตถุหลายชิ้นจากมันได้ สถานะของมันเหมือนกับรหัสคลาสในภาษา Java และเป็นแกนหลักของนิยามคลาสใน JavaScript วัตถุต้นแบบในตัวอย่างต่อไปนี้จะปรากฏเหมือนรหัสคลาส:
การคัดลอกรหัสมีดังนี้:
var p = {
เพิ่มขึ้น _by: 1,
เพิ่มขึ้น: ฟังก์ชั่น (x) {
ส่งคืน x + this.increment_by;
-
-
var a = object.create (p);
var b = object.create (p);
console.log (a.increment (7)); // 8
console.log (b.increment (9)); // 10
ในตัวอย่างข้างต้นวัตถุต้นแบบ P กำหนดคุณสมบัติ (เพิ่มขึ้น _by) ด้วยค่า 1 และฟังก์ชันที่เพิ่มขึ้น วัตถุ A และ B รับฟังก์ชั่นการเพิ่มขึ้นและฟังก์ชั่นการเพิ่มขึ้นจากเทมเพลต p เมื่อเรียกฟังก์ชั่นการเพิ่มขึ้นของวัตถุ A หรือ B JavaScript จะพยายามรับค่าเพิ่ม _by ของ A หรือ B (this.increment_by); เนื่องจากการเพิ่มขึ้น _by ได้รับจาก p ค่าของมันคือ 1 - ตัวแปรที่มีค่าเดียวกันคล้ายกับตัวแปรคลาสคงที่ใน Java ดังนั้นในตัวอย่างข้างต้นอักขระทุนทั้งหมดจะถูกใช้เมื่อตั้งชื่อตัวแปรที่เพิ่มขึ้น _by
ในตัวอย่างข้างต้นวัตถุทั้งหมดที่สร้างจากเทมเพลต P (วัตถุที่อยู่ในคลาสเดียวกัน) มีคุณสมบัติและพฤติกรรมเดียวกัน แต่ในความเป็นจริงสำหรับวัตถุที่แตกต่างกันของคลาสเดียวกันนอกเหนือจากการมีคุณลักษณะ/พฤติกรรมที่กำหนดโดยชั้นเรียนพวกเขามักจะมีคุณลักษณะและพฤติกรรมที่เป็นเอกลักษณ์ ดังนั้นหากคุณต้องการใช้เทมเพลตต้นแบบเป็นคลาสคุณต้องปรับแต่งแต่ละวัตถุที่ได้รับจากมัน:
การคัดลอกรหัสมีดังนี้:
var p = {
เพิ่มขึ้น _by: 1,
เพิ่มขึ้น: ฟังก์ชั่น (x) {
ส่งคืน x + this.increment_by + this.custom_increment_by;
-
-
var a = object.create (p);
var b = object.create (p);
a.custom_increment_by = 0;
b.custom_increment_by = 1;
console.log (a.increment (7)); // 8
console.log (b.increment (9)); // 11
ในตัวอย่างนี้วัตถุ A และ B ที่สร้างขึ้นจากเทมเพลต P มีตัวแปร custom_increment_by ซึ่งไม่จำเป็นต้องเท่ากับซึ่งกันและกันและผลลัพธ์สุดท้ายของการเพิ่มขึ้นของพฤติกรรมฟังก์ชั่นของฟังก์ชั่นนั้นเกี่ยวข้องกับค่าของ custom_increment_by โดยทั่วไปการทำงานของการปรับแต่งวัตถุใหม่มักจะดำเนินการในฟังก์ชั่นแบบครบวงจร:
การคัดลอกรหัสมีดังนี้:
var p = {
เพิ่มขึ้น _by: 1,
เพิ่มขึ้น: ฟังก์ชั่น (x) {
ส่งคืน x + this.increment_by + this.custom_increment_by;
-
-
ฟังก์ชั่น getIncrementalClassObject (CustomIncrementByValue) {
var uprementalobj = object.create (p);
incrementalobj.custom_increment_by = customincrementByValue;
return incrementalobj;
-
var a = getIncrementalClassObject (0);
var b = getIncrementalClassObject (1);
console.log (a.increment (7)); // 8
console.log (b.increment (9)); // 11
ด้วยวิธีนี้คำจำกัดความของคลาสจะเสร็จสิ้นผ่านฟังก์ชันวัตถุต้นแบบ P และ GetIncrementalClassObject (): วัตถุต้นแบบที่มีวัตถุต้นแบบสามารถรับได้โดยการเรียกฟังก์ชั่น GetIncrementalClassObject () และวัตถุใหม่เหล่านี้สามารถปรับแต่งได้ในระดับหนึ่ง เป็นที่น่าสังเกตว่าคลาสที่กำหนดนี้ไม่มีชื่อคลาสในเวลานี้ เพื่อคำอธิบายจะถูกเรียกว่าเพิ่มขึ้น
เมื่อมองย้อนกลับไปที่งานที่ทำในฟังก์ชั่น GetIncrementalClassObject () คุณจะเห็นว่ากระบวนการสร้างวัตถุใหม่จากคลาสที่เพิ่มขึ้นมีดังนี้:
1. สร้างวัตถุเปล่าและกำหนดวัตถุต้นแบบเป็น p
2. ปรับแต่งวัตถุเปล่าที่สร้างขึ้นใหม่นี้ตามค่าพารามิเตอร์ที่แตกต่างกัน
3. ส่งคืนวัตถุใหม่ที่ได้รับการปรับแต่ง
ใน JavaScript คุณสามารถกรอกคำจำกัดความของคลาสและการสร้างวัตถุใหม่ได้อย่างรวดเร็วโดยใช้ตัวสร้าง
ตัวสร้าง (ตัวสร้าง) ใน JavaScript
จากตัวอย่างของคลาสที่เพิ่มขึ้นด้านบนเราจะเห็นว่าการกำหนดคลาสใหม่ต้องใช้รหัสสองส่วน: การสร้างวัตถุต้นแบบเป็นเทมเพลตการสร้างฟังก์ชันที่กำหนดเองเพื่อเริ่มต้นวัตถุใหม่ การสร้างวัตถุใหม่จากคลาสจะผ่านกระบวนการสามกระบวนการ: การระบุวัตถุต้นแบบของวัตถุใหม่การปรับแต่ง/เริ่มต้นวัตถุใหม่และส่งคืนวัตถุใหม่นี้ ใน JavaScript ทั้งหมดนี้สามารถทำได้ผ่านตัวสร้าง (ตัวสร้าง)
ตัวสร้างใน JavaScript เป็นฟังก์ชั่นที่รับผิดชอบความรับผิดชอบในการเริ่มต้นวัตถุใหม่ ต้นแบบของฟังก์ชันตัวสร้างนี้ใช้เป็นเทมเพลตเพื่อสร้างวัตถุใหม่ การใช้คลาสที่เพิ่มขึ้นข้างต้นเป็นตัวอย่างหลังจากใช้ตัวสร้างเพื่อเขียนโค้ดใหม่ดูเหมือนว่า:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นเพิ่มขึ้น (customincrementByValue) {
this.custom_increment_by = customincrementByValue;
-
upremental.prototype = {
เพิ่มขึ้น _by: 1,
เพิ่มขึ้น: ฟังก์ชั่น (x) {
ส่งคืน x + this.increment_by + this.custom_increment_by;
-
-
var a = ใหม่เพิ่ม (0);
var b = เพิ่มใหม่ (1);
console.log (a.increment (7)); // 8
console.log (b.increment (9)); // 11
กระบวนการสร้างวัตถุใหม่โดยใช้ฟังก์ชันตัวสร้างผ่านคำหลักใหม่จะผ่านขั้นตอนต่อไปนี้:
สร้างวัตถุเปล่าใหม่
1. ชี้วัตถุต้นแบบของวัตถุนี้ไปยังคุณสมบัติต้นแบบของฟังก์ชันตัวสร้าง
2. ใช้วัตถุนี้เป็นพารามิเตอร์นี้และดำเนินการฟังก์ชันตัวสร้าง
3. นี่เป็นสิ่งเดียวกับงานก่อนหน้านี้ที่ทำในฟังก์ชัน GetIncrementalClassObject ()
ชื่อชั้นเรียน
เมื่อสร้างวัตถุโดยใช้ตัวสร้างวัตถุที่เกี่ยวข้องมี "ชื่อคลาส" ซึ่งสามารถตรวจสอบได้จากผลลัพธ์ของตัวดำเนินการอินสแตนซ์ของตัวดำเนินการ:
การคัดลอกรหัสมีดังนี้:
console.log (อินสแตนซ์ของการเพิ่มขึ้น); // true
console.log (b อินสแตนซ์ของการเพิ่มขึ้น); // true
อย่างไรก็ตามตัวดำเนินการอินสแตนซ์ของไม่ได้ระบุว่าวัตถุนั้นถูกสร้างขึ้นโดยตัวสร้างที่เพิ่มขึ้นหรือไม่ ตัวดำเนินการอินสแตนซ์ของตัวดำเนินการจะกำหนดว่าวัตถุต้นแบบของวัตถุนั้นเพิ่มขึ้นอย่างต่อเนื่องหรือไม่ เมื่อมีตัวสร้างสองตัวที่มีต้นแบบเดียวกันตัวดำเนินการอินสแตนซ์ของตัวดำเนินการจะส่งคืนจริงอย่างสม่ำเสมอโดยไม่แยกแยะว่าตัวสร้างที่ใช้ในการสร้างวัตถุ
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นเพิ่มขึ้น 2 (CustomIncrementByValue) {
this.custom_increment_by = customincrementByValue + 3;
-
incremental2.prototype = incremental.prototype;
console.log (อินสแตนซ์ของการเพิ่มขึ้น 2); // true