การสืบทอดเป็นวิธีที่สำคัญมากเมื่อเราใช้การเขียนโปรแกรมเชิงวัตถุ แม้ว่าเราจะบอกว่าเราไม่สามารถใช้งานได้มากเกินไปและใช้ชุดค่าผสมมากขึ้นแทนที่จะเป็นมรดก แต่การสืบทอดก็หลีกเลี่ยงไม่ได้เสมอ สิ่งที่เราต้องการพูดคุยที่นี่คือกลไกการสืบทอดในจาวาสคริปต์
จริงๆแล้วไม่มีแนวคิดเรื่องการสืบทอดใน JavaScript แต่เราสามารถเลียนแบบได้ด้วยวิธีการบางอย่าง การสืบทอดนี้จริง ๆ แล้วคัดลอกวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง คุณต้องทราบว่าคลาสท้องถิ่นและโฮสต์ทั้งหมดไม่สามารถสืบทอดเป็นคลาสพื้นฐานส่วนใหญ่สำหรับการพิจารณาความปลอดภัย
มีการถ่ายทอดมรดกประมาณสามประเภทใน JavaScript: 1. การแอบอ้างวัตถุ; 2. การสืบทอดต้นแบบ; 3. การผสมของทั้งสอง
1. การเลียนแบบวัตถุ
ในความเป็นจริงการแอบอ้างวัตถุมีความสัมพันธ์อย่างใกล้ชิดกับคำหลักนี้ (ดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องเข้าใจคำหลักนี้อย่างเต็มที่ใน JavaScript: P) ตัวสร้างใช้สิ่งนี้เพื่อกำหนดค่าให้กับแอตทริบิวต์และวิธีการและตัวสร้างยังถือได้ว่าเป็นฟังก์ชั่นธรรมดาดังนั้นเราจึงสามารถสร้างตัวสร้างของคอนสตรัคเตอร์คลาส A พื้นฐานของคลาสย่อยแล้วเรียกใช้ฟังก์ชั่นนี้ภายในคลาสย่อยและคลาสย่อยจะได้รับคุณสมบัติและวิธีการของคลาสแม่
หลักการนั้นง่ายมากเราจะนำไปใช้อย่างไร? มาใช้งานจริงโดยใช้ตัวอย่างรหัส
วิธีการใช้งาน 1 ของการเลียนแบบวัตถุ วิธีที่ใช้กันมากที่สุดของเราในการสร้างวัตถุใหม่:
การคัดลอกรหัสมีดังนี้:
var classa = function (ชื่อ) {
this.name = ชื่อ;
this.alertName = function () {
การแจ้งเตือน (this.name);
-
-
var classb = function (ชื่อ, อายุ) {
this.myconstructor = classa;
this.myconstructor (ชื่อ);
ลบสิ่งนี้ myconstructor;
this.age = อายุ;
this.alertage = function () {
การแจ้งเตือน (this.age);
-
-
เพื่อตรวจสอบว่าวิธีการข้างต้นถูกต้องคุณสามารถทดสอบด้วยตัวเองได้หรือไม่ ฉันจะเขียนรหัสที่ใช้สำหรับการทดสอบด้านล่าง:
การคัดลอกรหัสมีดังนี้:
var obja = ใหม่ classa ('dk');
obja.alertName (); // dk
var objb = ใหม่ classb ('ds', 20);
objb.alertName (); // ds
objb.alertage (); // 20
สิ่งนี้เรียกว่าการแอบอ้างวัตถุ นอกจากนี้ยังมีอีกสองวิธีในการใช้การเลียนแบบวัตถุ แม้ว่าวิธีการใช้งานของพวกเขาจะแตกต่างกัน แต่หลักการของพวกเขาก็เหมือนกัน
วิธีการใช้งานการแอบอ้างวัตถุ 2 ใช้วิธีการโทร:
การคัดลอกรหัสมีดังนี้:
var classa = function (ชื่อ) {
this.name = ชื่อ;
this.alertName = function () {
การแจ้งเตือน (this.name);
-
-
var classb = function (ชื่อ, อายุ) {
classa.call (ชื่อนี้);
this.age = อายุ;
this.alertage = function () {
การแจ้งเตือน (this.age);
-
-
นอกจากนี้ยังสามารถเห็นได้ผ่านรหัสที่ในวิธีแรกเราสร้างตัวชี้ฟังก์ชั่นใหม่เพื่อชี้ไปที่คลาสแม่ที่เรียกว่าฟังก์ชั่นแล้วลบตัวชี้ ที่นี่เราใช้วิธีการโทรเพื่อเรียกใช้คอนสตรัคเตอร์ของคลาสแม่ภายใต้วัตถุนี้เพื่อให้บรรลุวัตถุประสงค์เดียวกัน นอกจากนี้วิธีการโทรเป็นวิธีการใช้
วิธีการใช้งานการแอบอ้างวัตถุที่สาม ใช้วิธีการใช้:
การคัดลอกรหัสมีดังนี้:
var classa = function (ชื่อ) {
this.name = ชื่อ;
this.alertName = function () {
การแจ้งเตือน (this.name);
-
-
var classb = function (ชื่อ, อายุ) {
classa.apply (นี่คืออาร์เรย์ใหม่ (ชื่อ));
this.age = อายุ;
this.alertage = function () {
การแจ้งเตือน (this.age);
-
-
ในความเป็นจริงคุณจะเห็นว่าวิธีการใช้นั้นคล้ายกับวิธีการโทรมากยกเว้นว่าพารามิเตอร์จะแตกต่างกันเล็กน้อย
2. การสืบทอดต้นแบบ
ทุกคนควรมีความเข้าใจเกี่ยวกับวัตถุต้นแบบ คุณสมบัติและวิธีการทั้งหมดในวัตถุต้นแบบจะถูกส่งผ่านไปยังทุกกรณีของคลาส คุณสมบัติและวิธีการทั้งหมดของคลาสแม่จะจ่ายให้กับวัตถุต้นแบบของชั้นเด็กซึ่งเทียบเท่ากับการตระหนักถึงมรดกของเรา
หากคลาสย่อยต้องการรับคุณสมบัติและวิธีการทั้งหมดของคลาสแม่เราจะจ่ายอินสแตนซ์ของคลาสแม่ไปยังวัตถุต้นแบบของคลาสย่อยโดยตรง จากนั้นคลาสย่อยของเราไม่เทียบเท่ากับการได้รับวัตถุและวิธีการทั้งหมดของคลาสแม่?
บริการตัวอย่างรหัส:
การคัดลอกรหัสมีดังนี้:
var classa = function () {
this.name = 'dk';
this.alertName = function () {
การแจ้งเตือน (this.name);
-
-
var classb = function (ชื่อ, อายุ) {
this.name = ชื่อ;
this.age = อายุ;
-
classb.prototype = new classa ();
classb.prototype.alertage = function () {
การแจ้งเตือน (this.age);
-
โปรดทราบว่าตัวสร้างของคลาสแม่ที่นี่จำเป็นต้องตรวจสอบให้แน่ใจว่าไม่มีพารามิเตอร์ เพราะแม้ว่าจะมีพารามิเตอร์ตัวสร้างที่คุณไม่สามารถผ่านได้ =. = เมื่อใช้งานการสืบทอดต้นแบบ!
3. มิกซ์มิกซ์มิกซ์
ตามชื่อที่แนะนำการสืบทอดไฮบริดคือการใช้แบบผสมของสองวิธีแรก
การคัดลอกรหัสมีดังนี้:
var classa = function (ชื่อ) {
this.name = ชื่อ;
-
classa.prototype.alertName = function () {
การแจ้งเตือน (this.name);
-
var classb = function (ชื่อ, อายุ) {
classa.call (ชื่อนี้);
this.age = อายุ;
-
classb.prototype = new classa ();
classb.prototype.alertage = function () {
การแจ้งเตือน (this.age);
-
การใช้การเลียนแบบวัตถุใช้พารามิเตอร์ที่ส่งผ่านไปยังคลาสหลักและการใช้การสืบทอดการสืบทอดต้นแบบใช้การสืบทอดวิธีการสาธารณะ
หลังจากพูดคุยเกี่ยวกับวิธีการสืบทอดในทั้งสามพื้นที่นี้ได้เวลาพูดคุยเกี่ยวกับปัญหาด้านล่าง
คุณอาจงงงวยทำไมคุณต้องสร้างมรดกผสมกับการแอบอ้างวัตถุและการสืบทอดต้นแบบ? ใช่สิ่งที่สำคัญที่สุดคือคำถามนี้
1. หากคุณทดสอบจริงคุณจะพบว่าการสืบทอดที่นำมาใช้โดยการแอบอ้างวัตถุและคลาสย่อยไม่สามารถเข้าถึงวิธีการในห่วงโซ่ต้นแบบของคลาสแม่
2. การสืบทอดด้วยต้นแบบจะเปลี่ยนคุณลักษณะทั้งหมดให้เป็นคุณลักษณะที่ใช้ร่วมกัน หากคุณใช้สองอินสแตนซ์ในคลาสย่อยเดียวกันคุณจะพบว่าอินสแตนซ์ทั้งหมดของคุณแบ่งปันแอตทริบิวต์ทั้งหมด
3. แต่นี่เป็นสิ่งที่ไม่เหมาะสมอย่างแน่นอน ดังนั้นจึงมีวิธีการสืบทอดไฮบริดซึ่งช่วยให้แอตทริบิวต์ยังคงเป็นส่วนตัวและอนุญาตให้คลาสย่อยในการเข้าถึงห่วงโซ่ต้นแบบของคลาสแม่
คุณสามารถลองด้วยตัวเอง เมื่อวัตถุถูกแอบอ้างเป็นมรดก subclass ไม่สามารถเข้าถึงวิธีลูกโซ่ต้นแบบของคลาสแม่ อินสแตนซ์ทั้งหมดของการสืบทอดโซ่ต้นแบบการถ่ายทอดคลาสย่อยแบ่งปันแอตทริบิวต์คลาสแม่ทั้งหมด ฉันจะไม่เขียนตัวอย่างที่นี่