Inhaltsverzeichnis
Vererbung der ES6-Klasse
Warum muss der Konstruktor einer Unterklasse super() aufrufen?
Heim Web-Frontend Front-End-Fragen und Antworten Was wird verwendet, um die Vererbung in es6 zu implementieren?

Was wird verwendet, um die Vererbung in es6 zu implementieren?

Feb 14, 2023 pm 01:56 PM
es6 前端 继承

In es6 werden die Schlüsselwörter „class“ und „extends“ verwendet, um die Vererbung zu implementieren. Das Schlüsselwort „class“ wurde in ES6 eingeführt, um eine Klasse zu deklarieren, und die Klasse (class) kann über das Schlüsselwort „extends“ geerbt werden, sodass die Unterklasse die Eigenschaften und Methoden der übergeordneten Klasse erben kann. Die Syntax lautet „Name der übergeordneten Klasse {..“ .} Der Name der Unterklasse der Klasse erweitert den Namen der übergeordneten Klasse {...};".

Was wird verwendet, um die Vererbung in es6 zu implementieren?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, ECMAScript Version 6, Dell G3-Computer.

In es6 können das Schlüsselwort „class“ und das Schlüsselwort „extends“ verwendet werden, um die Vererbung zu implementieren.

Vererbung der ES6-Klasse

1 Einführung

Die Klasse kann eine Vererbung über das Schlüsselwort „extens“ erreichen, sodass Unterklassen die Eigenschaften und Methoden der übergeordneten Klasse erben können. Dies ist viel klarer und bequemer als die Implementierung der Vererbung durch ES5 durch Modifizieren der Prototypenkette.

//父类
class Point {
 ...
}
//子类
class ColorPoint extends Point {
	constructor(x, y, color) {
		super(x, y);
		this.color = color;
	}
	toString() {
		return this.color + '' + super.toString(); // 调用父类的toString方法
	}
}
Nach dem Login kopieren

Im obigen Code erscheint das Schlüsselwort super sowohl in der Konstruktormethode als auch in der toString-Methode. Super stellt hier den Konstruktor der übergeordneten Klasse dar, der zum Erstellen eines neuen Instanzobjekts der übergeordneten Klasse verwendet wird.

ES6 schreibt vor, dass Unterklassen super() in der Konstruktormethode aufrufen müssen, andernfalls wird ein Fehler gemeldet. Dies liegt daran, dass das eigene Objekt dieser Unterklasse zuerst durch den Konstruktor der übergeordneten Klasse geformt werden muss, um dieselben Instanzattribute wie die übergeordnete Klasse zu erhalten . und Methoden, und fügen Sie dann die eigenen Instanzeigenschaften und -methoden der Unterklasse hinzu.

Warum muss der Konstruktor einer Unterklasse super() aufrufen?

Dies liegt daran, dass im Vererbungsmechanismus von ES5 zuerst ein Instanzobjekt einer unabhängigen Unterklasse erstellt wird und dann die Methoden der übergeordneten Klasse zu diesem Objekt hinzugefügt werden, dh „Instanz zuerst, Vererbung zuletzt“; Der Vererbungsmechanismus besteht darin, zunächst die Attribute und Methoden der übergeordneten Klasse einem leeren Objekt hinzuzufügen und das Objekt dann als Instanz der Unterklasse zu verwenden, dh „Vererbung zuerst, Instanz zuletzt“.

Das bedeutet, dass jedes Mal, wenn eine neue Unterklasseninstanz erstellt wird, zuerst der Konstruktor der übergeordneten Klasse ausgeführt werden muss.

class Foo {
	constructor() {
		console.log(1);
	}
}

class Bar extends Foo {
	constructor() {
		super();
		console.log(2);
	}
}

const bar = new Bar(); // 1 2
Nach dem Login kopieren

Wenn im obigen Code die Unterklassenleiste eine neue Instanz erstellt, werden 1 und 2 ausgegeben. Das ist die Faktorklassenkonstruktion Wenn die Funktion super() aufruft, wird der Konstruktor der übergeordneten Klasse einmal ausgeführt. Dieses Schlüsselwort kann nur nach dem Aufruf von super im Konstruktor einer Unterklasse verwendet werden, andernfalls wird ein Fehler gemeldet. Dies liegt daran, dass beim Aufbau einer Unterklasseninstanz zunächst die Vererbung der übergeordneten Klasse abgeschlossen werden muss. Nur die Supermethode kann es der Unterklasseninstanz ermöglichen, die übergeordnete Klasse zu erben.

class Point {
	constructor(x, y) {
		this.x = x;
		this.y = y;
	}
}

class ColorPoint extends Point {
	constructor(x, y, color) {
		this.color = color;
		super(x, y);
		this.color = color;
	}
}"
Nach dem Login kopieren

Wenn die Unterklasse keine Konstruktormethode definiert, wird diese Methode standardmäßig hinzugefügt und super darin aufgerufen. Mit anderen Worten, unabhängig davon, ob sie explizit definiert ist oder nicht, verfügt jede Unterklasse über eine Konstruktormethode.

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
}
class ColorPoint extends Point {
}

let cp = new ColorPoint(25, 8);
console.log(cp); //{x: 25, y: 8}

class ColorPoint extends Point {
  constructor(...args) {
    super(...args);
  }
}

let cp = new ColorPoint(25, 8);
console.log(cp); //{x: 25, y: 8}
Nach dem Login kopieren

2. Private Vererbung von Eigenschaften und privaten Methoden

Alle Eigenschaften und Methoden der übergeordneten Klasse werden von der Unterklasse geerbt, mit Ausnahme privater Eigenschaften und Methoden. Unterklassen können die privaten Eigenschaften der übergeordneten Klasse nicht erben, oder private Eigenschaften können nur in der Klasse verwendet werden, in der sie definiert sind.

class Foo {
  #p = 1;
  #m() {
    console.log('hello');
  }
}

class Bar extends Foo {
  constructor() {
    super();
    console.log(this.#p); // 报错
    this.#m(); // 报错
  }
}
Nach dem Login kopieren

Wenn im obigen Beispiel die Unterklasse Bar die privaten Eigenschaften oder privaten Methoden der übergeordneten Klasse Foo aufruft, wird ein Fehler gemeldet.

Wenn die übergeordnete Klasse Lese- und Schreibmethoden für private Eigenschaften definiert, kann die Unterklasse über diese Methoden private Eigenschaften lesen und schreiben.

class Foo {
  #p = 1;
  getP() {
    return this.#p;
  }
}

class Bar extends Foo {
  constructor() {
    super();
    console.log(this.getP()); // 1
  }
}
Nach dem Login kopieren

3. Vererbung statischer Eigenschaften und Methoden

Die statischen Eigenschaften und statischen Methoden der übergeordneten Klasse werden auch von der Unterklasse geerbt.

class A {
  static hello() {
    console.log('hello world');
  }
}

class B extends A {
}

B.hello()  // hello world
Nach dem Login kopieren

Im obigen Code ist hello() eine statische Methode der Klasse A und B erbt A</code >, erbt auch die statische Methode von <code>A. hello()A类的静态方法,B继承A,也继承了A的静态方法。

注意,静态属性是通过浅拷贝实现继承的,如果继承的属性是原始数据类型,子类中操作继承的静态属性不会影响到父类,但如果继承的属性是一个对象,那么子类修改这个属性会印象到父类

class C {
	static foo = 100;
}

class D extends C {
	constructor() {
		super();
		D.foo--;
	}
}

const d = new D();
C.foo; // 100
D.foo;  // 99

class A {
	static foo = { n: 100 };
}

class B extends A {
	constructor() {
		super();
		B.foo.n--;
	}
}

const b = new B();
B.foo.n // 99
A.foo.n  // 99
Nach dem Login kopieren

4.Object.getPrototypeOf()

Object.getPrototypeOf()

Beachten Sie, dass statische Eigenschaften durch flaches Kopieren geerbt werden. Wenn die geerbten Eigenschaften ein primitiver Datentyp sind, wirkt sich die Operation der geerbten statischen Eigenschaften in der Unterklasse nicht auf die übergeordnete Klasse aus Unterklasse Das Ändern dieser Eigenschaft wird die übergeordnete Klasse beeindrucken.

class Point { /*...*/ }

class ColorPoint extends Point { /*...*/ }

Object.getPrototypeOf(ColorPoint) === Point
// true
Nach dem Login kopieren

Daher können Sie mit dieser Methode feststellen, ob eine Klasse eine andere Klasse erbt.

5. Schlüsselwort super

Das Schlüsselwort super kann als Funktion oder Objekt verwendet werden

Im ersten Fall, wenn super als Funktion aufgerufen wird, stellt es den Konstruktor der übergeordneten Klasse dar. Die Funktion des Aufrufs von super besteht darin, dieses Objekt der Unterklasse zu bilden und die Instanzattribute und Methoden der übergeordneten Klasse auf dieses Objekt zu setzen.

class A {
	constructor() {
    console.log(new.target.name);
  }
}

class B extends A {
	constructor() {
		super();
	}
}

new A(); // A
new B(); // B
Nach dem Login kopieren

Im zweiten Fall, wenn super als Objekt verwendet wird, zeigt es in gewöhnlichen Methoden auf das Prototypobjekt der übergeordneten Klasse; in statischen Methoden zeigt es auf die übergeordnete Klasse.

class A {
	p() {
    return 2;
  }
}

class B extends A {
  constructor() {
    super();
    console.log(super.p()); // 2
  }
}

let b = new B();
Nach dem Login kopieren

Im obigen Code verwendet super.p() in der Unterklasse B super als Objekt. Zu diesem Zeitpunkt zeigt super im gewöhnlichen Objekt auf A.prototype und super.p() entspricht A.prototype. .P().

Da super auf das Prototypobjekt der übergeordneten Klasse verweist, können die in der Instanz der übergeordneten Klasse definierten Methoden oder Attribute nicht über super aufgerufen werden. Wie unten gezeigt:

class A {
	constructor() {
		this.p = 2;
	}
}

class B extends A {
	get m() {
		return spuer.p;
	}
}

let b = new B();
b.m // undefined
Nach dem Login kopieren

Um dieses Problem zu lösen, können Sie die Attribute für das Prototypobjekt der übergeordneten Klasse definieren.

class A {};
A.prototype.x = 2;

class B extends A {
	constructor() {
		super();
		console.log(super.x);
	}
}

let b = new B();
Nach dem Login kopieren

ES6 legt fest, dass beim Aufrufen der Methode der übergeordneten Klasse über super die normale Methode der Unterklasse aufgerufen wird , dies innerhalb der Methode zeigt auf die aktuelle Unterklasseninstanz🎜
class A {
	constructor() {
		this.x = 1;
	}
	print() {
		console.log(this.x);
	}
}

class B extends A {
	constructor() {
		super();
		this.x = 2;
	}
	m() {
		super.print();
	}
}

let b = new B();
b.m(); // 2
Nach dem Login kopieren

上面代码中,super.print()调用的是A.prototype.print(),但是此时方法内部的this指向是子类B的实例,所以输出2。

由于this指向的是子类实例,所有如果通过super对某个属性赋值,这时super就是this,赋值的属性会变成子类实例的属性

class A {
	constructor() {
		this.x = 1;
	}
}

class B extends A {
	constructor() {
		super();
		this.x = 2;
		super.x = 3;
		console.log(super.x); //undefind
		console.log(this.x); // 3
	}
}
Nach dem Login kopieren

上面代码中,super.x赋值为3,这时等同于对this.x赋值为3。而当读取super.x 的时候,读的是A.prototype.x,所以返回undefined

如果super作为对象,用在静态方法之中,这时super将指向父类,而不是父类的原型对象。

class Parent {
	static myMethod(msg) {
		console.log(&#39;static&#39;, msg);
	}

	myMethod(msg) {
		console.log(&#39;instance&#39;, msg);
	}
}

class Children extends Parent {
	static myMethod(msg) {
		super.myMthod(msg);
	}

	myMethod(msg) {
    super.myMethod(msg);
  }
}

Child.myMethod(1); // static 1

var child = new Child();
child.myMethod(2); // instance 2
Nach dem Login kopieren

上面代码中,super在静态方法之中指向父类,在普通方法之中指向父类的原型对象。

另外,在子类的静态方法中通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类的实例

class A {
	constructor() {
    this.x = 1;
  }
  static print() {
    console.log(this.x);
  }
}

class B extends A {
  constructor() {
    super();
    this.x = 2;
  }
  static m() {
    super.print();
  }
}

B.x = 3;
B.m() // 3
Nach dem Login kopieren

在静态方法m中,super.print指向父类的静态方法,到那时this指向的是类B,而不是B的实例。

【推荐学习:javascript高级教程

Das obige ist der detaillierte Inhalt vonWas wird verwendet, um die Vererbung in es6 zu implementieren?. 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 尊渡假赌尊渡假赌尊渡假赌

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.

PHP und Vue: eine perfekte Kombination von Front-End-Entwicklungstools PHP und Vue: eine perfekte Kombination von Front-End-Entwicklungstools Mar 16, 2024 pm 12:09 PM

PHP und Vue: eine perfekte Kombination von Front-End-Entwicklungstools In der heutigen Zeit der rasanten Entwicklung des Internets ist die Front-End-Entwicklung immer wichtiger geworden. Da Benutzer immer höhere Anforderungen an das Erlebnis von Websites und Anwendungen stellen, müssen Frontend-Entwickler effizientere und flexiblere Tools verwenden, um reaktionsfähige und interaktive Schnittstellen zu erstellen. Als zwei wichtige Technologien im Bereich der Front-End-Entwicklung können PHP und Vue.js in Kombination als perfekte Waffe bezeichnet werden. In diesem Artikel geht es um die Kombination von PHP und Vue sowie um detaillierte Codebeispiele, die den Lesern helfen sollen, diese beiden besser zu verstehen und anzuwenden

Häufig gestellte Fragen von Front-End-Interviewern Häufig gestellte Fragen von Front-End-Interviewern Mar 19, 2024 pm 02:24 PM

In Front-End-Entwicklungsinterviews decken häufige Fragen ein breites Themenspektrum ab, darunter HTML/CSS-Grundlagen, JavaScript-Grundlagen, Frameworks und Bibliotheken, Projekterfahrung, Algorithmen und Datenstrukturen, Leistungsoptimierung, domänenübergreifende Anfragen, Front-End-Engineering, Designmuster sowie neue Technologien und Trends. Interviewerfragen sollen die technischen Fähigkeiten, die Projekterfahrung und das Verständnis des Kandidaten für Branchentrends beurteilen. Daher sollten Kandidaten in diesen Bereichen umfassend vorbereitet sein, um ihre Fähigkeiten und Fachkenntnisse unter Beweis zu stellen.

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.

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.

Erkundung der Front-End-Technologie der Go-Sprache: eine neue Vision für die Front-End-Entwicklung Erkundung der Front-End-Technologie der Go-Sprache: eine neue Vision für die Front-End-Entwicklung Mar 28, 2024 pm 01:06 PM

Als schnelle und effiziente Programmiersprache erfreut sich Go im Bereich der Backend-Entwicklung großer Beliebtheit. Allerdings assoziieren nur wenige Menschen die Go-Sprache mit der Front-End-Entwicklung. Tatsächlich kann die Verwendung der Go-Sprache für die Front-End-Entwicklung nicht nur die Effizienz verbessern, sondern Entwicklern auch neue Horizonte eröffnen. In diesem Artikel wird die Möglichkeit der Verwendung der Go-Sprache für die Front-End-Entwicklung untersucht und spezifische Codebeispiele bereitgestellt, um den Lesern ein besseres Verständnis dieses Bereichs zu erleichtern. In der traditionellen Frontend-Entwicklung werden häufig JavaScript, HTML und CSS zum Erstellen von Benutzeroberflächen verwendet

Kombination von Golang- und Front-End-Technologie: Entdecken Sie, welche Rolle Golang im Front-End-Bereich spielt Kombination von Golang- und Front-End-Technologie: Entdecken Sie, welche Rolle Golang im Front-End-Bereich spielt Mar 19, 2024 pm 06:15 PM

Kombination von Golang und Front-End-Technologie: Um zu untersuchen, welche Rolle Golang im Front-End-Bereich spielt, sind spezifische Codebeispiele erforderlich. Mit der rasanten Entwicklung des Internets und mobiler Anwendungen ist die Front-End-Technologie immer wichtiger geworden. Auch in diesem Bereich kann Golang als leistungsstarke Back-End-Programmiersprache eine wichtige Rolle spielen. In diesem Artikel wird untersucht, wie Golang mit Front-End-Technologie kombiniert wird, und sein Potenzial im Front-End-Bereich anhand spezifischer Codebeispiele demonstriert. Die Rolle von Golang im Front-End-Bereich ist effizient, prägnant und leicht zu erlernen

Was ist ein modulares Front-End-ESM? Was ist ein modulares Front-End-ESM? Feb 25, 2024 am 11:48 AM

Was ist Front-End-ESM? Spezifische Codebeispiele sind erforderlich. Bei der Front-End-Entwicklung bezieht sich ESM auf ECMAScriptModules, eine modulare Entwicklungsmethode, die auf der ECMAScript-Spezifikation basiert. ESM bietet viele Vorteile, wie z. B. eine bessere Codeorganisation, Isolierung zwischen Modulen und Wiederverwendbarkeit. In diesem Artikel werden die grundlegenden Konzepte und die Verwendung von ESM vorgestellt und einige spezifische Codebeispiele bereitgestellt. Das Grundkonzept von ESM In ESM können wir den Code in mehrere Module unterteilen, und jedes Modul stellt einige Schnittstellen für andere Module bereit

See all articles