Inhaltsverzeichnis
Prinzip der Prototypenvererbung
Prototypobjekt
Eigenschaftslesevorgang
Prototypenkette
Implementierung der prototypischen Vererbung
Zusammenfassung
Heim Web-Frontend js-Tutorial Parsen der prototypischen Vererbung von JavaScript

Parsen der prototypischen Vererbung von JavaScript

Apr 05, 2017 pm 02:05 PM

Das Wesen der Vererbung: Wiederverwendung

Bevor wir die prototypische Vererbung von JavaScript besprechen, wollen wir darüber nachdenken, warum wir erben müssen?

Stellen Sie sich ein Szenario vor: Wenn wir zwei Objekte haben, sind einige ihrer Attribute gleich und die anderen unterschiedlich. Normalerweise besteht eine gute Designlösung darin, dieselbe Logik zur Wiederverwendung zu extrahieren.

Nehmen Sie als Beispiel zwei Schüler xiaoMing liLei. Die beiden Klassenkameraden haben eigene Namen und stellen sich vor. Als Programmobjekt abstrahiert kann es wie folgt dargestellt werden.

var xiaoMing = {
  name : "xiaoMing",
  hello : function(){
    console.log( 'Hello, my name is '+ this.name + '.');
  }
}

var liLei = {
  name : "liLei",
  hello : function(){
    console.log( 'Hello, my name is '+ this.name  + '.');
  }
}
Nach dem Login kopieren

Studenten, die Java verwendet haben, denken möglicherweise zunächst darüber nach, objektorientiert zu verwenden, um dieses Problem zu lösen. Erstellen Sie eine Person-Klasse und instanziieren Sie zwei Objekte, xiaoMing und liLei. In ES6 gibt es auch ein Konzept, das den Klassen in Java ähnelt: class .

Im Folgenden wird die ES6-Syntax verwendet und objektorientierte Ideen verwendet, um den obigen Code zu rekonstruieren.

class Person {
  constructor(name){
    this.name = name
  }

  hello(){
    console.log(this.name);
  }
}

var xiaoMing = new Person('xiaoMing');
var liLei = new Person('liLei');
Nach dem Login kopieren

Wie Sie sehen können, wird durch die Verwendung der Klasse zum Erstellen von Objekten der Zweck der Wiederverwendung erreicht. Die Logik, auf der es basiert, besteht darin, dass eine Vorlage abstrahiert werden kann und mehrere ähnliche Objekte entsprechend der Vorlage kopiert werden können, wenn zwei oder mehr Objekte ähnliche Strukturen und Funktionen haben.

Verwenden Sie Klassen, um Objekte zu erstellen, genau wie ein Fahrradhersteller, der immer wieder dieselben Baupläne verwendet, um eine große Anzahl von Fahrrädern zu bauen.

Natürlich gibt es mehr als eine Lösung für das Wiederverwendungsproblem. Traditionelle objektorientierte Klassen sind nur eine der Lösungen. Jetzt ist unser Protagonist an der Reihe, die „prototypische Vererbung“, die das Problem der Wiederverwendung aus einem anderen Blickwinkel löst.

Prinzip der Prototypenvererbung

Prototypobjekt

Objekt in JavaScript besteht aus zwei Teilen, einer Sammlung gewöhnlicher Eigenschaften und Prototypeigenschaften.

var o = {
  a : 'a',
  ...
  proto: prototypeObj
}
Nach dem Login kopieren

Gewöhnliche Attribute beziehen sich auf ein; Prototypattributebeziehen sich auf einen Prototyp. Dies war nicht Teil der Spezifikation. Später stellte Chrome die zugrunde liegenden Eigenschaften der Sprache durch ein Proto offen, das nach und nach von allen akzeptiert und der ES6-Spezifikation hinzugefügt wurde. Der Wert von o.protoprototypObj ist Prototypobjekt. Das Prototypobjekt ist eigentlich ein gewöhnliches Objekt. Der Grund, warum es als Prototypobjekt bezeichnet wird, liegt einfach darin, dass es sich um den Wert handelt, auf den das Prototypattribut verweist.

Das Prototyp-Objekt ist etwas Besonderes, weil es eine Fähigkeit besitzt, die gewöhnliche Objekte nicht haben: seine Eigenschaften mit anderen Objekten zu teilen.

In der ES6-Spezifikation ist es wie folgt definiert:

object that provides shared properties for other objects
Nach dem Login kopieren

Eigenschaftslesevorgang

Gehen Sie zurück zum ursprünglichen Beispiel und sehen Sie, wie Sie es mithilfe der prototypischen Vererbung implementieren Wiederverwendungszwecke.

var prototypeObj = {
  hello: function(){
    console.log( 'Hello, my name is '+ this.name  + '.');
  }
  // ...
}

var xiaoMing = {
  name : "xiaoMing",
  proto : prototypeObj
}

var liLei = {
  name : "liLei",
  proto :  prototypeObj
}

xiaoMing.hello(); // Hello, my name is xiaoMing.
liLei.hello();  // Hello, my name is liLei.
Nach dem Login kopieren

xiaoMing liLei Das Objekt hat nicht direkt das Hallo-Attribut (Methode), aber es kann das Attribut lesen (die Methode ausführen).

Stellen Sie sich ein Szenario vor, in dem Sie Mathe-Hausaufgaben machen und auf eine schwierige Frage stoßen, von der Sie nicht wissen, wie man sie löst. Und Sie haben einen guten Bruder, der sehr gut in Mathematik ist. Sie bitten ihn um Hilfe und lösen dieses Problem.

Es gibt kein Hallo-Attribut für das xiaoMing-Objekt, aber es hat einen guten Bruder, PrototypObj. Wenn bei Attributlesevorgängen das Hallo-Attribut in xiaoMing nicht gefunden wird, fragt es seinen Bruder „prototypObj“. Daher wird die Hello-Methode ausgeführt.

Prototypenkette

Es ist immer noch ein Beispiel für die Lösung mathematischer Probleme. Deine Mathefrage ist schwierig und dein Bruder hat keine Antwort. Er empfiehlt dir, sie einem anderen Klassenkameraden zu stellen. Auf diese Weise werden Sie nicht mehr fragen, bis Sie die Antwort haben oder niemand mehr da ist, der Sie fragen könnte. Es ist, als gäbe es eine unsichtbare Kette, die Sie mit Ihren Klassenkameraden verbindet.

In JS wird der Lesevorgang Schicht für Schicht durch Proto verkettet, was als Prototypenkette bezeichnet wird.

var deepPrototypeObj = {
  hello: function(){
    console.log( 'Hello, my name is '+ this.name  + '.');
  }
  proto : null
}

var prototypeObj = {
  proto : deepPrototypeObj
}

var xiaoMing = {
  name : "xiaoMing",
  proto : prototypeObj
}

var liLei = {
  name : "liLei",
  proto :  prototypeObj
}

xiaoMing.hello(); // Hello, my name is xiaoMing.
liLei.hello();  // Hello, my name is liLei.
Nach dem Login kopieren

Implementierung der prototypischen Vererbung

Im obigen Beispiel wird die prototypische Vererbung durch direktes Ändern des Prototypattributwerts implementiert. Aber in der tatsächlichen Produktion besteht die

Alternative darin, die Methode Object.create() zu verwenden.

Durch den Aufruf der Methode Object.create() wird ein neues Objekt erstellt und das Prototypobjekt des Objekts als erster übergebener Parameter angegeben.

Ändern wir das obige Beispiel.

var prototypeObj = {
  hello: function(){
    console.log( 'Hello, my name is '+ this.name  + '.');
  }
  // ...
}

var xiaoMing = Object.create(prototypeObj);
var liLei = Object.create(prototypeObj);

xiaoMing.name = "xiaoMing";
liLei.name = "liLei";

xiaoMing.hello(); // Hello, my name is xiaoMing.
liLei.hello();  // Hello, my name is liLei.
Nach dem Login kopieren

Der Autor von You-Dont-Know-JS hat der Implementierung der prototypischen Vererbung einen sehr interessanten Namen gegeben: OLOO (objects-linked-to-other-objects). Der Vorteil dieser Implementierungsmethode besteht darin verwendet kein Klassenkonzept, sondern nur ein Objekt und ist daher sehr konsistent mit den Eigenschaften von JavaScript.

Weil es in JS keine Klassen gibt, sondern nur Objekte.

Leider gibt es zu viele Programmierer, die Klassen mögen, daher wurde das Klassenkonzept in ES6 hinzugefügt. Im nächsten Artikel geht es um das Implementierungsprinzip von Klassen in JS

Zusammenfassung

Klasse erstellt Objekte, um den Zweck der Wiederverwendung zu erreichen. Die Logik, auf der es basiert, besteht darin, dass zwei oder mehr Objekte ähnliche Strukturen und Funktionen haben. Eine Vorlage kann abstrahiert werden und mehrere ähnliche Objekte können entsprechend der Vorlage kopiert werden. Es ist, als würden Fahrradhersteller immer wieder dieselben Baupläne verwenden, um viele Fahrräder zu bauen.

Durch die Verwendung der prototypischen Vererbung kann auch der Zweck der Wiederverwendung erreicht werden. Die Logik, auf der es basiert, besteht darin, dass zwei oder mehr Objekte über einige gemeinsame Attribute verfügen. Durch spezielle Prototypattribute können die öffentlichen Objekte mit dem Lesen (Schreiben) von gewöhnlichen Objekten verknüpft und wiederverwendet werden ) Regeln werden durchlaufen und durchsucht, um die Attribut--Freigabe zu realisieren.


Das obige ist der detaillierte Inhalt vonParsen der prototypischen Vererbung von JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

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.

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.

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.

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

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

„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

Erläuterung der C++-Funktionsvererbung: Wann sollte die Vererbung nicht verwendet werden? Erläuterung der C++-Funktionsvererbung: Wann sollte die Vererbung nicht verwendet werden? May 04, 2024 pm 12:18 PM

Die Vererbung von C++-Funktionen sollte in den folgenden Situationen nicht verwendet werden: Wenn eine abgeleitete Klasse eine andere Implementierung erfordert, sollte eine neue Funktion mit einer anderen Implementierung erstellt werden. Wenn eine abgeleitete Klasse keine Funktion erfordert, sollte sie als leere Klasse deklariert werden oder private, nicht implementierte Mitgliedsfunktionen der Basisklasse verwenden, um die Funktionsvererbung zu deaktivieren. Wenn Funktionen keine Vererbung erfordern, sollten andere Mechanismen (z. B. Vorlagen) verwendet werden, um eine Wiederverwendung des Codes zu erreichen.

See all articles