ภาพรวม
เรากำลังพูดถึงอะไรเมื่อเรากำลังพูดถึงการเขียนโปรแกรมเชิงวัตถุ?
ก่อนอื่นเราพูดถึงแนวคิดบางอย่าง: วัตถุชั้นเรียนการห่อหุ้มมรดกความหลากหลาย
วัตถุและคลาสเป็นพื้นฐานของการมุ่งเน้นวัตถุและการห่อหุ้มการถ่ายทอดและ polymorphism เป็นคุณสมบัติหลักสามประการของการเขียนโปรแกรมเชิงวัตถุ
JavaScript จัดเตรียมวัตถุ แต่ขาดคลาสและไม่สามารถกำหนดคลาสเช่น C#ได้อย่างชัดเจน
อย่างไรก็ตามฟังก์ชั่นฟังก์ชั่นของ JavaScript นั้นมีความยืดหยุ่นมากซึ่งหนึ่งในนั้นคือตัวสร้างซึ่งสามารถใช้ "คลาส" ร่วมกับตัวสร้างและวัตถุต้นแบบ
แนวคิดวัตถุและคลาส
วัตถุ
"Object" เป็นแนวคิดที่สำคัญมากในการเขียนโปรแกรมเชิงวัตถุ วัตถุคือคำอธิบายของ "สิ่ง" (ใครบางคนหรือบางสิ่งบางอย่าง)
ผู้คนและสิ่งต่าง ๆ มาจากชีวิตจริงและความเข้าใจของเราเกี่ยวกับโลกแห่งความจริงคือความเข้าใจของเราเกี่ยวกับผู้คนและสิ่งต่าง ๆ
ในสาขาการเขียนโปรแกรมรหัสเป็นนามธรรมสำหรับคนทั่วไปและการประยุกต์ใช้รหัสคือการแก้ปัญหาในโลกแห่งความเป็นจริงได้ดีขึ้น
ในระหว่างขั้นตอนการวิเคราะห์และการออกแบบแนวคิดของ "วัตถุ" สามารถสะท้อนปัญหาในโลกแห่งความจริงได้ดีขึ้น
ในทางกลับกันรหัสมีตรรกะบางอย่างซึ่งใช้เพื่ออธิบายธุรกิจ ธุรกิจมีความรู้ทางธุรกิจบางอย่าง ความรู้ทางธุรกิจสรุปผ่านความเข้าใจและการวิเคราะห์โลกแห่งความเป็นจริง ปัญหาเหล่านี้ประกอบด้วย "วัตถุ" ในโลกแห่งความเป็นจริง
วัตถุมีคุณสมบัติและพฤติกรรม ในแง่ของ OOP คุณสมบัติเป็นคุณลักษณะของวัตถุและพฤติกรรมเป็นวิธีการของวัตถุ
ใจดี
ในโลกแห่งความเป็นจริงวัตถุที่คล้ายกันสามารถจัดกลุ่มตามมาตรฐานบางอย่าง ตัวอย่างเช่น "Hummingbirds" และ "Eagles" ทั้งคู่แบ่งออกเป็นนก นกไม่ใช่วัตถุเฉพาะ พวกเขาเป็นแนวคิดที่สรุปโดยผู้คนหลังจากวิเคราะห์ลักษณะและพฤติกรรมที่คล้ายคลึงกันตามนกที่เฉพาะเจาะจงเช่น "นกฮัมมิงเบิร์ด" และ "นกอินทรี" คลาสนั้นเทียบเท่ากับเทมเพลตและเราสามารถสร้างวัตถุเฉพาะที่แตกต่างกันตามเทมเพลตนี้
ใน C#เราสามารถกำหนดนกได้
/// <summary> //// birds /// </summary> นกชั้นสาธารณะ {โมฆะสาธารณะบิน () {Console.writeLine ("ฉันบินได้!"); -แม้ว่า JavaScript เป็นภาษาการเขียนโปรแกรมเชิงวัตถุ แต่ก็ไม่ได้ให้การสนับสนุนทางไวยากรณ์สำหรับชั้นเรียน
ใน JavaScript ทุกอย่างขึ้นอยู่กับวัตถุ แม้แต่ "ต้นแบบ" เราจะพูดถึงในภายหลังเป็นวัตถุ การสืบทอดและการใช้ JavaScript ซ้ำจะถูกนำมาใช้ผ่านต้นแบบ
อย่างไรก็ตามการรวมตัวสร้างและวัตถุต้นแบบสามารถใช้ "คลาส" ของ JavaScript
ตัวสร้าง
ก่อนหน้านี้เราใช้ Array ใหม่ () เพื่อสร้างอาร์เรย์และใช้วัตถุใหม่ () เพื่อสร้างวัตถุ Array () และ Object () เป็นสองตัวสร้างใน JavaScript แม้ว่า JavaScript ไม่ได้ให้ชั้นเรียน แต่เราสามารถเข้าใจอาร์เรย์และวัตถุเป็นแนวคิดของ "คลาส"
ควรสังเกตว่า "คลาส" ของ JavaScript ถูกนำมาใช้โดยตัวสร้าง
กำหนดตัวสร้าง
ตัวสร้างยังเป็นฟังก์ชั่นและไม่มีความแตกต่างทางไวยากรณ์ระหว่างการกำหนดคอนสตรัคเตอร์และฟังก์ชั่นอื่น ๆ
ความแตกต่างเพียงอย่างเดียวคือตัวอักษรตัวแรกของตัวสร้างควรเป็นตัวพิมพ์ใหญ่ซึ่งเป็นข้อกำหนดการเขียนโปรแกรมของ JavaScript
ต่อไปนี้กำหนดตัวสร้างบุคคล () ตัวสร้างซึ่งเราสามารถเข้าใจได้ว่าเป็นชั้นเรียนบุคคล
Function Person () {console.log ('ฉันเป็น Keepfool');}"คลาส" และตัวสร้างของ JavaScript ถูกกำหนดในเวลาเดียวกัน เมื่อกำหนด "คลาส" ใน JavaScript ตัวสร้างจะถูกกำหนดในเวลาเดียวกัน
ใช้ตัวสร้าง
JavaScript ใช้คลาสเดียวกับ C#โดยมีคำหลักใหม่ตามด้วยตัวสร้าง
var p = คนใหม่ ();
กำหนดคุณลักษณะและวิธีการ
ตอนนี้เราได้กำหนดคลาสบุคคลแล้วเราสามารถเพิ่มคุณสมบัติและวิธีการบางอย่างให้กับคลาสบุคคล
กำหนดคุณลักษณะ
เมื่อพูดถึงวัตถุ JavaScript เราพูดถึงการตั้งค่าคุณสมบัติและการเข้าถึงวัตถุ
รหัสนี้แสดงสองวิธีในการกำหนดคุณสมบัติวัตถุ:
var cat = {color: 'black'}; cat.name = 'tom'; console.log (cat.color); console.log (cat.name);ใช้สิ่งนี้เพื่อกำหนดคุณลักษณะ
วิธีการนิยามแอตทริบิวต์ของคลาส JavaScript ค่อนข้างแตกต่างกัน ใช้คำหลักนี้เพื่อกำหนดแอตทริบิวต์ในตัวสร้าง:
ฟังก์ชันบุคคล (ชื่อ) {this.name = name;}•บรรทัดแรกของรหัสกำหนดคลาสบุคคลและกำหนดตัวสร้าง
•บรรทัดที่สองของรหัสกำหนดแอตทริบิวต์ชื่อ
สร้างและใช้วัตถุ
รหัส 2 บรรทัดต่อไปนี้สร้างวัตถุคลาสสองคน
var p1 = บุคคลใหม่ ('James'); var p2 = บุคคลใหม่ ('cury');เอาต์พุต p1.name และ p2.name ในคอนโซล Chrome
P1 และ P2 เป็นสองวัตถุที่แตกต่างกันการแก้ไข P1 ชื่อจะไม่ส่งผลกระทบต่อ p2.name
P1.Name = 'LeBron James';
กำหนดวิธีการ
ก่อนอื่นมาแยกความแตกต่างของคำว่า "ฟังก์ชั่น" และ "วิธี" "ฟังก์ชั่น" เป็นหน่วยอิสระในขณะที่ "วิธี" ขึ้นอยู่กับการมีอยู่ของคลาสเป็นเรื่อง
ใช้สิ่งนี้เพื่อกำหนดวิธีการ
ใน JavaScript วิธีการคลาสคือการกำหนดฟังก์ชั่นในตัวสร้างและใช้คำหลักนี้เพื่อกำหนดวิธีการในตัวสร้าง:
ฟังก์ชันบุคคล (ชื่อ) {// กำหนดแอตทริบิวต์ this.name = name; // กำหนดวิธีนี้ this.sayhello = function () {return 'hello, ฉัน' + this.name;}}วิธีใช้
เรียกวิธี Sayhello () ของวัตถุ P1 และ P2 ตามลำดับในคอนโซลโครเมี่ยม
แอตทริบิวต์ตัวสร้าง
เมื่อวัตถุถูกสร้างขึ้นคุณสมบัติพิเศษจะถูกกำหนดให้กับวัตถุโดย JavaScript โดยอัตโนมัติและคุณสมบัตินี้เป็นคุณสมบัติตัวสร้าง
ป้อน p1.constructor ในคอนโซลโครเมี่ยมและคุณจะเห็นว่าคุณสมบัติตัวสร้างของวัตถุ P1 ชี้ไปที่ฟังก์ชัน
ดูเนื้อหาของฟังก์ชั่นนี้ไม่ใช่ตัวสร้างบุคคล () หรือไม่?
ซึ่งหมายความว่าเรายังสามารถสร้างวัตถุผ่านคุณสมบัติ P1.Constructor
var p3 = ใหม่ p1.constructor ('Steve Nash');รหัสบรรทัดนี้อธิบายประโยค: "ฉันไม่สนใจว่าวัตถุ P1 จะถูกสร้างขึ้นอย่างไร แต่ฉันต้องการให้วัตถุอื่นถูกสร้างขึ้นเช่น P1!"
การใช้ตัวดำเนินการอินสแตนซ์ของคอนโซลโครเมี่ยมคุณจะเห็นว่า P1, P2 และ P3 เป็นทุกกรณีของคลาสบุคคล
นอกจากนี้เมื่อเราสร้างวัตถุในวิธี {} ตัวสร้างวัตถุ () จะเรียกจริง
var o = {};บรรทัดของรหัสนี้ประกาศวัตถุ แม้ว่าเราจะไม่ได้ตั้งค่าคุณสมบัติและวิธีการใด ๆ แต่เอ็นจิ้น JavaScript จะตั้งค่าแอตทริบิวต์ตัวสร้างตามค่าเริ่มต้น
o.constructor ชี้ไปที่ตัวสร้างวัตถุ (), [native code] แสดงให้เห็นว่า Object () เป็นฟังก์ชั่นในตัวใน JavaScript
วัตถุต้นแบบ
ใน JavaScript เมื่อกำหนดฟังก์ชั่น ฟังก์ชั่น จะมีแอตทริบิวต์ต้นแบบและตัวสร้างก็ไม่มีข้อยกเว้น
รูปต่อไปนี้แสดงให้เห็นว่าคุณสมบัติต้นแบบของตัวสร้างบุคคล () ตัวสร้างเป็นวัตถุ ซึ่งเป็นของฟังก์ชั่น และเราเรียกว่าคุณสมบัตินี้ เป็นวัตถุต้นแบบ
จากมุมมองของชั้นเรียนบุคคลเรายังสามารถเข้าใจได้ว่าแอตทริบิวต์ต้นแบบเป็นของคลาสบุคคล
ในเวลาเดียวกันอินสแตนซ์ของคลาสบุคคลไม่มีแอตทริบิวต์ต้นแบบ p1.prototype ในรูปด้านบนไม่ได้กำหนดซึ่งหมายความว่าแอตทริบิวต์ต้นแบบถูกแชร์ซึ่งเป็นเหมือนแอตทริบิวต์คงที่ใน C#
การตั้งค่าต้นแบบ
เนื่องจากต้นแบบเป็นวัตถุคุณสามารถเพิ่มคุณสมบัติและวิธีการลงไปได้
การกำหนดคุณสมบัติและวิธีการเกี่ยวกับคุณสมบัติต้นแบบของฟังก์ชั่นไม่แตกต่างจากคุณสมบัติการตั้งค่าและวิธีการของวัตถุธรรมดา
รหัสต่อไปนี้กำหนดคุณสมบัติและวิธีการสำหรับ person.prototype
ฟังก์ชั่นบุคคล (ชื่อ) {this.name = name; this.sayhello = function () {return 'hello, ฉันคือ' + this.name;}} // กำหนดคุณสมบัติและวิธีการบนตัวสร้างวัตถุของตัวสร้าง P1 = คนใหม่ ('James');ใช้ต้นแบบ
คุณสมบัติและวิธีการต้นแบบที่กำหนดไว้ในบุคคล prototype สามารถใช้โดยตรงโดยอินสแตนซ์ของคลาสบุคคลและยังคงใช้ในรูปแบบของ object.property
ควรสังเกตว่า name และ sayHello() เป็นกรณีของคลาสบุคคลในขณะที่ height และ run() เป็นกรณีที่ไม่ได้เป็นของชั้นเรียนบุคคล
เคล็ดลับ: คุณสามารถตรวจสอบได้ว่าวัตถุนั้นมีคุณสมบัติหรือวิธีการบางอย่างผ่านวิธี HasownProperty หรือไม่
คุณลักษณะต้นแบบ
อินสแตนซ์ของคลาสบุคคลสามารถใช้คุณสมบัติทั้งสองในชั้นเรียนบุคคลและคุณสมบัติในบุคคล prototype
ดังนั้นความแตกต่างระหว่างคุณสมบัติของชั้นเรียนบุคคลและคุณสมบัติของบุคคลคืออะไร?
ก่อนอื่นเราสามารถเข้าใจคุณสมบัติและวิธีการในคลาสบุคคลเป็น "คุณสมบัติอินสแตนซ์"
เนื่องจากมีการแบ่งปันต้นแบบเราสามารถเข้าใจคุณสมบัติและวิธีการในต้นแบบเป็น "คุณสมบัติที่ใช้ร่วมกัน"
ความแตกต่างระหว่าง "แอตทริบิวต์อินสแตนซ์" และ "แอตทริบิวต์ที่ใช้ร่วมกัน" ส่วนใหญ่สะท้อนให้เห็นในประสิทธิภาพ
ทุกครั้งที่มีการสร้างอินสแตนซ์ของบุคคลสำเนาของแอตทริบิวต์ชื่อและวิธี Sayhello () จะถูกสร้างขึ้นและแอตทริบิวต์ความสูงและวิธีการเรียกใช้ () จะแบ่งปันสำเนาของทุกกรณี
ในกรณีนี้หมายความว่าวิธี Sayhello () สามารถกล่าวถึงในต้นแบบ
นอกจากนี้ความสูงอินสแตนซ์ของบุคคลที่แตกต่างกันอาจแตกต่างกันดังนั้นจึงควรมีเหตุผลมากกว่าที่จะนำไปไว้ในชั้นเรียนบุคคล
ฟังก์ชั่นบุคคล (ชื่อ, ความสูง) {this.name = name; this.height = ความสูง;} person.prototype.sayhello = function () {return 'hello, ฉันคือ' + this.name + 'ความสูงของฉันคือ' this.height + 'cm.'; P1 = บุคคลใหม่ ('James', 203); var p2 = บุคคลใหม่ ('cury', 190);สรุปการใช้งานชั้นเรียน
JavaScript ไม่มีคลาส แต่ตัวสร้างสามารถใช้ "คลาส"
ตามข้อกำหนดการเขียนโปรแกรม JavaScript ตัวอักษรตัวแรกของตัวสร้างควรเป็นตัวพิมพ์ใหญ่
คุณสมบัติและวิธีการของ "คลาส" ถูกกำหนดไว้ในตัวสร้างในวิธีนี้
เมื่อสร้างการสร้างวัตถุ JavaScript จะกำหนดแอตทริบิวต์ตัวสร้างให้กับวัตถุ แอตทริบิวต์ตัวสร้างเป็นการอ้างอิงถึงฟังก์ชันตัวสร้างวัตถุ
ฟังก์ชั่นนี้มีแอตทริบิวต์ต้นแบบเมื่อมีการกำหนดและแอตทริบิวต์ต้นแบบก็เป็นวัตถุเช่นกัน
ต้นแบบมีการแบ่งปันและคุณสมบัติและวิธีการที่กำหนดไว้ในต้นแบบสามารถใช้งานได้โดยอินสแตนซ์ของ "คลาส"
หากคุณสมบัติหรือวิธีการสามารถกำหนดได้บนต้นแบบอย่ากำหนดไว้ในตัวสร้าง การใช้ต้นแบบสามารถลดค่าใช้จ่ายหน่วยความจำได้
บทความข้างต้นเกี่ยวกับ JavaScript OOP - รายละเอียดการใช้งานชั้นเรียนเป็นเนื้อหาทั้งหมดที่ฉันได้แบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น