ฉันคิดว่าทุกคนมีความคิดเห็นของตัวเองว่า JavaScript เป็นภาษาที่มุ่งเน้นวัตถุหรือภาษาเชิงวัตถุหรือไม่ แฟน ๆ ที่ซื่อสัตย์ของ JavaScript ต้องบอกว่า JavaScript เป็นภาษาที่มุ่งเน้นวัตถุ ตัวอย่างเช่นคำสั่งเกี่ยวกับ JavaScript ในหนังสือ "The Return of the King of JavaScript" ขึ้นอยู่กับวัตถุต้นแบบที่มุ่งเน้นวัตถุ ให้ฉันพูดถึงความคิดเห็นส่วนตัวของฉัน คุณสมบัติที่มุ่งเน้นวัตถุทั้งสาม: การสืบทอดความหลากหลายและการห่อหุ้ม แม้ว่า JavaScript จะไม่เร็วเท่ากับภาษาที่มุ่งเน้นวัตถุเช่น Java และ C#แต่ก็มีการสนับสนุนบางอย่างหลังจากทั้งหมด ดังนั้นจึงสมเหตุสมผลที่จะบอกว่า JavaScript เป็นภาษาที่มุ่งเน้นวัตถุ แต่จากส่วนการสืบทอดมีชุดของวิธีการสืบทอด แต่วิธีการสืบทอดแต่ละวิธีไม่สามารถตระหนักถึงพลังของภาษาที่มุ่งเน้นวัตถุอย่างแท้จริง ดังนั้นจึงเป็นเรื่องที่ไกลเกินกว่าที่จะบอกว่ามันมุ่งเน้นไปที่วัตถุ โดยสรุปความเข้าใจของฉันเกี่ยวกับ JavaScript นั้นเต็มใจที่จะเรียกมันว่าเป็นวัตถุที่เน้นวัตถุที่ง่ายขึ้นหรือ "pseudo" เชิงวัตถุ (คำหลอกนี้ไม่มีความหมายเสื่อมเสีย)
วันนี้มาพูดคุยเกี่ยวกับคุณสมบัติแรกของวัตถุที่มุ่งเน้น: มรดก
มรดกคืออะไร? ฉันไม่อยากพูดเรื่องไร้สาระเกี่ยวกับเรื่องนี้ มีสัตว์คนและผู้หญิง นี่คือห่วงโซ่การสืบทอดที่ง่ายที่สุดและทั่วไป
ในวัตถุที่มุ่งเน้นเช่น C#มันง่าย
การคัดลอกรหัสมีดังนี้:
สัตว์ชั้น
-
คนชั้นเรียน: สัตว์
-
ชั้นเรียนสาว: คน
-
ดังนั้นใน JavaScript ไม่มีชั้นเรียนหรือมรดกที่จะให้การใช้งานเราควรทำอย่างไร?
การปลอมแปลงวัตถุ (วิธีการสืบทอดการก่อสร้าง)
การอำพรางวัตถุคืออะไร? สิ่งที่เราอาจเรียกว่าการสร้างมรดกนั้นง่ายต่อการเข้าใจ ตามชื่อที่แนะนำมันคือการใช้ตัวสร้างเพื่อเล่นกับมรดก ในความเป็นจริงมันหมายความว่าตัวสร้างคลาสแม่ถือเป็นวิธีธรรมดาและนำไปไว้ในคอนสตรัคเตอร์คลาสย่อยเพื่อดำเนินการ ด้วยวิธีนี้เมื่อสร้างวัตถุวัตถุคลาสย่อยสามารถสร้างวิธีการคลาสแม่!
ลองใช้ตัวอย่างข้างต้นรหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นสัตว์ ()
-
this.run = function () {การแจ้งเตือน ("ฉันสามารถเรียกใช้"));};
-
ฟังก์ชั่นคน (ชื่อ)
-
// ที่นี่วิธีการก่อสร้างของชั้นพาเรนต์จะถูกส่งผ่านและจากนั้นวิธีการก่อสร้างของคลาสแม่จะถูกดำเนินการ ในเวลานี้สามารถใช้วิธีการในคลาสหลักได้
สิ่งนี้พ่อ = สัตว์;
this.father ();
// อย่าลืมลบมันมิฉะนั้นเมื่อมีการเพิ่มคลาสย่อยลงในวิธีการที่มีชื่อเดียวกับคลาสแม่มันจะถูกแก้ไขในคลาสพาเรนต์
ลบสิ่งนี้พ่อ;
this.name = ชื่อ;
this.say = function () {alert ("ชื่อของฉันคือ"+this.name);}
-
ฟังก์ชั่นสาว (ชื่ออายุ)
-
สิ่งนี้พ่อ = ผู้คน;
สิ่งนี้พ่อ (ชื่อ);
ลบสิ่งนี้พ่อ;
this.age = อายุ;
this.introduce = function () {การแจ้งเตือน ("ชื่อของฉันคือ"+this.name+". ฉัน"+this.age);};
-
ด้วยวิธีนี้จะมีการดำเนินการห่วงโซ่มรดกและการทดสอบคือ:
การคัดลอกรหัสมีดังนี้:
var a = สัตว์ใหม่ ();
a.run ();
var p = คนใหม่ ("windking");
p.run ();
P.Say ();
var g = สาวใหม่ ("xuan", 22);
g.run ();
G.Say ();
G.introduce ();
ผลลัพธ์มีดังนี้:
.
ข.
ค.
d.
ก.
f.
การทดสอบประสบความสำเร็จ!
มาสรุปคีย์ของรหัสนี้ระบุคลาสหลักประกาศวัตถุคลาสแม่แล้วลบตัวแปรชั่วคราว คุณคิดว่ามันค่อนข้างลำบากหรือไม่? อย่างน้อยนั่นคือสิ่งที่ฉันคิด เมื่อฉันลืมที่จะลบฉันต้องแบกรับความเสี่ยงของชั้นเรียนหลักที่ถูกแก้ไข สำหรับสิ่งนี้เราใช้การโทรและสมัครเพื่อปรับปรุงสิ่งนี้!
ลองดูที่รหัสและตัวอย่างด้านบน (เพื่อให้ทุกคนเข้าใจได้ง่ายขึ้นความจำเป็นในการเปลี่ยนมันสัตว์มีชื่อ):
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นสัตว์ (ชื่อ)
-
this.run = function () {การแจ้งเตือน ("ฉันสามารถเรียกใช้"));};
-
ฟังก์ชั่นคน (ชื่อ)
-
// ใช้วิธีการโทรเพื่อใช้การสืบทอด
สิ่งนี้พ่อ = สัตว์;
this.father.call (ชื่อนี้);
this.name = ชื่อ;
this.sayName = function () {Alert ("ชื่อของฉันคือ"+this.name;);};
-
ฟังก์ชั่นสาว (ชื่ออายุ)
-
// ใช้วิธีการใช้เพื่อใช้การสืบทอด
สิ่งนี้พ่อ = ผู้คน;
this.father.apply (นี่คืออาร์เรย์ใหม่ (ชื่อ));
this.age = อายุ;
this.introduce = function () {การแจ้งเตือน ("ชื่อของฉันคือ"+this.name+". ฉัน"+this.age);};
-
เมื่อใช้รหัสทดสอบเดียวกันพบว่าการทดสอบนั้นประสบความสำเร็จ
หากคุณเป็นสามเณรคุณอาจรู้สึกเวียนหัวเล็กน้อยเมื่อคุณดูรหัสสองรหัสด้านล่าง การโทรคืออะไรและมีอะไรบ้าง? ตกลงในหัวข้อพิเศษของการสืบทอด Wanzhuan ฉันได้เพิ่มซีรีส์ฉบับเสริม หากคุณไม่เข้าใจสิ่งนี้คุณสามารถอ่านบทความของฉัน: "Word of Wanzhuan: โทรและสมัคร"
การปลอมตัวของวัตถุเป็นเพียงวิธีการใช้มรดก ในบทความถัดไปฉันจะเขียนเกี่ยวกับวิธีการสืบทอดอื่น ๆ ต่อไปและข้อดีและข้อเสียของวิธีการสืบทอดหลายวิธี ยินดีต้อนรับสู่การให้ความสนใจต่อไป