Heim Web-Frontend js-Tutorial Objektorientierte JavaScript-Implementierung der Vererbung basierend auf Funktionsfälschung

Objektorientierte JavaScript-Implementierung der Vererbung basierend auf Funktionsfälschung

Jan 19, 2017 pm 03:24 PM

Aufgrund einiger Mängel bei der Implementierung der Vererbung basierend auf der Prototypenkette haben die Menschen eine andere Methode zur Implementierung der Vererbung übernommen – die Implementierung der Vererbung basierend auf Funktionsfälschung. Die Idee dieser Technik besteht darin, den Konstruktor der übergeordneten Klasse innerhalb des Konstruktors der untergeordneten Klasse aufzurufen.

Implementierung der Vererbung basierend auf Funktionsfälschung

Da in JavaScript eine Funktion ein Objekt ist, das Code in einer bestimmten Umgebung ausführt, können wir die Methode call() oder apply() verwenden Führen Sie den Konstruktor des übergeordneten Klassenobjekts für das untergeordnete Klassenobjekt aus. Schauen wir uns das folgende Beispiel an:

/* 创建父类 */
function Parent(){
  this.color = ["red","blue"];
}
 
/* 创建子类 */
function Child(){
  // 继承父类的属性
  Parent.call(this);
}
Nach dem Login kopieren

Im obigen Code erstellen wir zunächst eine übergeordnete Klasse „Parent“, dann eine Unterklasse „Child“ und verwenden „Parent.call(this)“ innerhalb der Unterklasse, um das zu vervollständigen Nachlass.

Im Artikel Eigenschaften von Funktionen haben wir die Methoden call() und apply() vorgestellt. Die Funktion dieser beiden Methoden besteht darin, Funktionen in einem bestimmten Bereich aufzurufen, was bedeutet, dass diese beiden Methoden a aufrufen können Funktion anhand ihres Namens. Hier verwenden wir Parent.call(this); innerhalb von Child, um die Vererbung abzuschließen. Dieser Satz bezieht sich zu diesem Zeitpunkt auf das Child-Objekt (in Child sollte dies das Objekt sein, das ausgeführt wird). Child), also ist es gleichbedeutend mit this.color = ["red", "blue"]; in Child, was dem Vorhandensein dieses.color-Attributs in Child entspricht, was ebenfalls eine getarnte Form ist. Die Vererbung ist abgeschlossen.

Wir können es mit der folgenden Methode überprüfen:

var c1 = new Child();     //创建子类对象c1
c1.color.push("Green");   //为c1添加新的颜色
console.info(c1.color);   //控制台输出:red,blue,Green
 
var c2 = new Child();     //创建子类对象c2
console.info(c2.color);   //控制台输出:red,blue
Nach dem Login kopieren

Im obigen Code erstellen wir das Unterklassenobjekt c1 und fügen ihm eine neue Farbe „Grün“ hinzu. So wird es sein Ausgabe in der Konsole: „rot, blau, grün“. Dann haben wir das Objekt c2 erstellt. Da ihm keine neue Farbe hinzugefügt wurde, wird in der Konsole nur die von der übergeordneten Klasse geerbte Farbe ausgegeben: „rot, blau“.

Jedes Mal, wenn ein neues Kind aufgerufen wird, entspricht dies der Durchführung einer Objektattributeinstellung. Zu diesem Zeitpunkt verfügt jedes Objekt über ein Farbattribut im Raum, ist jedoch im Prototyp nicht vorhanden, sodass keine Farbe vorhanden ist geteilt. Dies löst das Problem der Referenztypvariablen bei der Vererbung der Prototypenkette.

Unterklassenkonstruktor

Ein weiterer Nachteil der Prototypkettenvererbung besteht darin, dass der Konstruktor der übergeordneten Klasse nicht von der Unterklasse aufgerufen werden kann, sodass es keine Möglichkeit gibt, Attribute in der Unterklasse der übergeordneten Klasse zuzuweisen . Mitte. Dieses Problem lässt sich gut durch Funktionsfälschung lösen. Schauen wir uns das folgende Beispiel an:

// 创建父类
function Parent(name){
  this.name = name;
}
 
//创建子类
function Student(name,age){
  //使用伪造的方式就可以把子类的构造函数参数传递到父类中
  Parent.call(this,name); //调用父类的属性
  this.age = age;
}
 
var s1 = new Student("Leon",22);
var s2 = new Student("Ada",25);
 
console.info(s1.name + "," + s1.age);  // 控制台输出:Leon,22
console.info(s2.name + "," + s2.age);  // 控制台输出:Ada,25
Nach dem Login kopieren

Im obigen Code ruft die Unterklasse Student das Namensattribut der übergeordneten Klasse durch Funktionsfälschung auf, wodurch der Unterklasse tatsächlich ein Namensattribut hinzugefügt wird. Hier übergibt die Methode call() den Parameternamen der Student-Klasse an die übergeordnete Klasse, und der abgeschlossene Vorgang entspricht this.name = name;. Und dieses Namensattribut ist das Namensattribut der Unterklasse, nicht das Namensattribut der übergeordneten Klasse.

Probleme mit der Vererbung aufgrund von Funktionsfälschungen

In der obigen Diskussion haben wir nur darüber gesprochen, dass die Unterklasse die Attribute der übergeordneten Klasse erbt. Wie erbt die Unterklasse also die Methoden der übergeordneten Klasse? ? Wie bereits erwähnt, legen wir die Methode normalerweise im Prototyp fest. Beispielsweise gibt es in der übergeordneten Klasse einen Code wie folgt:

// 创建父类
function Parent(name){
  this.name = name;
}
 
// 父类的say()方法
Parent.prototype.say = function(){
  console.info(this.name);
}
 
//创建子类
function Student(name,age){
  Parent.call(this,name); 
  this.age = age;
}
Nach dem Login kopieren

Aufgrund der Verwendungsmethode Bei einer Funktionsfälschung wird die Unterklasse nicht abgeschlossen. Der Prototyp von Student zeigt auf die übergeordnete Klasse. Nachdem die Unterklasse die übergeordnete Klasse geerbt hat, ist die Methode say () nicht vorhanden. Die Möglichkeit, dieses Problem zu lösen, besteht darin, die Methode say() im übergeordneten Element zu platzieren und sie mit dem Schlüsselwort this zu erstellen.

// 创建父类
function Parent(name){
  this.name = name;
  // 父类的say()方法
  this.say = function(){
    console.info(this.name);
  }
}
 
//创建子类
function Student(name,age){
  Parent.call(this,name); 
  this.age = age;
}
Nach dem Login kopieren

Obwohl dies der Unterklasse ermöglicht, die say()-Methode der übergeordneten Klasse zu erben, entsteht ein weiteres Problem: Jedes Mal, wenn ein Unterklassenobjekt erstellt wird, wird eine say()-Methode generiert viel Speicherplatz frei.

Da es auch Mängel bei der Implementierung der Vererbung auf Basis von Funktionsfälschungen gibt, werden wir diese Methode nicht allein zur Vervollständigung der Vererbung verwenden, sondern eine kombinationsbasierte Methode zur Implementierung der Vererbung verwenden. Wir werden dies im nächsten Artikel besprechen Stellen Sie diese Vererbungsmethode vor.

Das Obige ist der objektorientierte Inhalt von JavaScript – Vererbung basierend auf Funktionsfälschung. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Detaillierte Erläuterung der C++-Funktionsvererbung: Wie werden „Basisklassenzeiger' und „abgeleitete Klassenzeiger' bei der Vererbung verwendet? Detaillierte Erläuterung der C++-Funktionsvererbung: Wie werden „Basisklassenzeiger' und „abgeleitete Klassenzeiger' bei der Vererbung verwendet? May 01, 2024 pm 10:27 PM

Verwenden Sie bei der Funktionsvererbung „Basisklassenzeiger“ und „abgeleitete Klassenzeiger“, um den Vererbungsmechanismus zu verstehen: Wenn der Basisklassenzeiger auf das abgeleitete Klassenobjekt zeigt, wird eine Aufwärtstransformation durchgeführt und nur auf die Mitglieder der Basisklasse zugegriffen. Wenn ein abgeleiteter Klassenzeiger auf ein Basisklassenobjekt zeigt, wird eine Abwärtsumwandlung durchgeführt (unsicher) und muss mit Vorsicht verwendet werden.

Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Jan 05, 2024 pm 06:08 PM

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Ausführliche Erklärung der C++-Funktionsvererbung: Wie kann man Fehler bei der Vererbung debuggen? Ausführliche Erklärung der C++-Funktionsvererbung: Wie kann man Fehler bei der Vererbung debuggen? May 02, 2024 am 09:54 AM

Tipps zum Debuggen von Vererbungsfehlern: Stellen Sie sicher, dass die Vererbungsbeziehungen korrekt sind. Verwenden Sie den Debugger, um den Code schrittweise durchzugehen und Variablenwerte zu untersuchen. Stellen Sie sicher, dass Sie den virtuellen Modifikator richtig verwenden. Untersuchen Sie das Problem der Vererbungsdiamanten, das durch versteckte Vererbung verursacht wird. Suchen Sie nach nicht implementierten rein virtuellen Funktionen in abstrakten Klassen.

Ausführliche Erklärung der C++-Funktionsvererbung: Wie versteht man die Beziehung „is-a' und „has-a' bei der Vererbung? Ausführliche Erklärung der C++-Funktionsvererbung: Wie versteht man die Beziehung „is-a' und „has-a' bei der Vererbung? May 02, 2024 am 08:18 AM

Detaillierte Erläuterung der C++-Funktionsvererbung: Beherrschen Sie die Beziehung zwischen „is-a“ und „has-a“ Was ist Funktionsvererbung? Funktionsvererbung ist eine Technik in C++, die in einer abgeleiteten Klasse definierte Methoden mit in einer Basisklasse definierten Methoden verknüpft. Es ermöglicht abgeleiteten Klassen, auf Methoden der Basisklasse zuzugreifen und diese zu überschreiben, wodurch die Funktionalität der Basisklasse erweitert wird. „Ist-ein“- und „Hat-ein“-Beziehungen Bei der Funktionsvererbung bedeutet die „Ist-ein“-Beziehung, dass die abgeleitete Klasse ein Untertyp der Basisklasse ist, d. h. die abgeleitete Klasse „erbt“ die Merkmale und das Verhalten von die Basisklasse. Die „has-a“-Beziehung bedeutet, dass die abgeleitete Klasse einen Verweis oder Zeiger auf das Basisklassenobjekt enthält, d. h. die abgeleitete Klasse „besitzt“ das Basisklassenobjekt. SyntaxDas Folgende ist die Syntax für die Implementierung der Funktionsvererbung: classDerivedClass:pu

Wie wirken sich Vererbung und Polymorphismus auf die Klassenkopplung in C++ aus? Wie wirken sich Vererbung und Polymorphismus auf die Klassenkopplung in C++ aus? Jun 05, 2024 pm 02:33 PM

Vererbung und Polymorphismus wirken sich auf die Kopplung von Klassen aus: Vererbung erhöht die Kopplung, da die abgeleitete Klasse von der Basisklasse abhängt. Polymorphismus reduziert die Kopplung, da Objekte über virtuelle Funktionen und Basisklassenzeiger konsistent auf Nachrichten reagieren können. Zu den Best Practices gehören der sparsame Umgang mit der Vererbung, die Definition öffentlicher Schnittstellen, das Vermeiden des Hinzufügens von Datenelementen zu Basisklassen und die Entkopplung von Klassen durch Abhängigkeitsinjektion. Ein praktisches Beispiel, das zeigt, wie Polymorphismus und Abhängigkeitsinjektion verwendet werden, um die Kopplung in einer Bankkontoanwendung zu reduzieren.

So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript Jan 05, 2024 pm 01:37 PM

Einführung in die Methode zum Abrufen des HTTP-Statuscodes in JavaScript: Bei der Front-End-Entwicklung müssen wir uns häufig mit der Interaktion mit der Back-End-Schnittstelle befassen, und der HTTP-Statuscode ist ein sehr wichtiger Teil davon. Das Verstehen und Abrufen von HTTP-Statuscodes hilft uns, die von der Schnittstelle zurückgegebenen Daten besser zu verarbeiten. In diesem Artikel wird erläutert, wie Sie mithilfe von JavaScript HTTP-Statuscodes erhalten, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist ein HTTP-Statuscode? HTTP-Statuscode bedeutet, dass der Dienst den Dienst anfordert, wenn er eine Anfrage an den Server initiiert

„Einführung in die objektorientierte Programmierung in PHP: Vom Konzept zur Praxis' „Einführung in die objektorientierte Programmierung in PHP: Vom Konzept zur Praxis' Feb 25, 2024 pm 09:04 PM

Was ist objektorientierte Programmierung? Objektorientierte Programmierung (OOP) ist ein Programmierparadigma, das reale Entitäten in Klassen abstrahiert und Objekte zur Darstellung dieser Entitäten verwendet. Klassen definieren die Eigenschaften und das Verhalten von Objekten und Objekte instanziieren Klassen. Der Hauptvorteil von OOP besteht darin, dass Code einfacher zu verstehen, zu warten und wiederzuverwenden ist. Grundkonzepte von OOP Zu den Hauptkonzepten von OOP gehören Klassen, Objekte, Eigenschaften und Methoden. Eine Klasse ist der Bauplan eines Objekts, der seine Eigenschaften und sein Verhalten definiert. Ein Objekt ist eine Instanz einer Klasse und verfügt über alle Eigenschaften und Verhaltensweisen der Klasse. Eigenschaften sind Merkmale eines Objekts, das Daten speichern kann. Methoden sind Funktionen eines Objekts, die mit den Daten des Objekts arbeiten können. Vorteile von OOP Zu den Hauptvorteilen von OOP gehören: Wiederverwendbarkeit: OOP kann den Code erweitern

Java-Schnittstellen und abstrakte Klassen: Der Weg zum Programmierhimmel Java-Schnittstellen und abstrakte Klassen: Der Weg zum Programmierhimmel Mar 04, 2024 am 09:13 AM

Schnittstelle: Eine implementierte Vertragsschnittstelle definiert eine Reihe von Methodensignaturen in Java, stellt jedoch keine konkrete Implementierung bereit. Es fungiert als Vertrag, der Klassen, die die Schnittstelle implementieren, dazu zwingt, ihre angegebenen Methoden zu implementieren. Die Methoden in der Schnittstelle sind abstrakte Methoden und haben keinen Methodenkörper. Codebeispiel: publicinterfaceAnimal{voideat();voidsleep();} Abstrakte Klasse: Teilweise implementierter Entwurf Eine abstrakte Klasse ist eine übergeordnete Klasse, die eine teilweise Implementierung bereitstellt, die von ihren Unterklassen geerbt werden kann. Im Gegensatz zu Schnittstellen können abstrakte Klassen konkrete Implementierungen und abstrakte Methoden enthalten. Abstrakte Methoden werden mit dem Schlüsselwort abstract deklariert und müssen von Unterklassen überschrieben werden. Codebeispiel: publicabstractcla

See all articles