Heim Web-Frontend js-Tutorial Detaillierte Erläuterung der prototypbasierten Vererbungsfunktionen in JavaScript_Grundkenntnisse

Detaillierte Erläuterung der prototypbasierten Vererbungsfunktionen in JavaScript_Grundkenntnisse

May 16, 2016 pm 03:02 PM
javascript Prototyp 继承

Vererbung in JavaScript ist ziemlich seltsam. Schnittstellenvererbung kann nicht implementiert werden und kann nur auf prototypischer Vererbung basieren.

Prototypenkette
Ein Prototyp ist ein Objekt. Die vom Konstruktor erstellte Instanz verfügt über einen Zeiger, der auf den Prototyp zeigt, um die Eigenschaften und Methoden des Prototyps abzurufen. Auf diese Weise verfügt das Instanzobjekt über die Attributmethoden des Konstruktors und die Attributmethoden des Prototyps. Zeigen Sie dann auf den Prototyp des Konstruktors, der auf diese Instanz vererbt werden muss, und Sie können alle Attributmethoden dieser Instanz verwenden Erbe erreichen.
Schauen Sie sich den Democode unten an:

//声明超类,通过构造函数和原型添加有关属性和方法
function Super(){
  this.property = true;
}
Super.prototype.getSuperValue = function() {
  return this.property;
};

//声明子类的构造函数
function SubType() {
  this.subproperty = false;
}
//将子类的原型指向超类的实例,得到超类的一切
SubType.prototype = new Super();
SubType.prototype.constructor = SubType;
SubType.prototype.getSubValue = function(){
  return this.subproperty;
};
//由子类创建对象,测试是否继承超类方法和属性
var instance = new SubType();
console.log(instance.getSuperValue());

Nach dem Login kopieren

Der Standardprototyp aller Funktionen ist eine Instanz von Object, daher enthält der Standardprototyp einen internen Zeiger, der auf Object.prototype zeigt.
Verwenden Sie „instanceof“ und „isPrototypeOf“, um die Beziehung zwischen Prototyp und Instanz zu bestimmen:

instance instanceof Object;
Object.prototype.isPrototypeOf(instance);
Nach dem Login kopieren

Bei Verwendung der Prototypenkette müssen Sie die Methode sorgfältig definieren. Wenn eine Unterklasse eine Methode oder Erweiterung des Supertyps überschreiben muss, muss sie nach der Anweisung platziert werden, die den Prototyp ersetzt, damit sie wirksam werden kann. Darüber hinaus können Sie bei der Implementierung der Vererbung über die Prototypenkette keine Objektliterale verwenden, um Prototypenmethoden zu erstellen, die die Prototypenkette überschreiben würden:

......
SubType.prototype = new Super();
SubType.prototype = {
  ....
};
Nach dem Login kopieren

Dadurch wird der Zeiger ersetzt, der auf das neue Objekt zeigt, und so die Prototypenkette neu geschrieben.
Die Vererbungsmethode der Prototypkette ist fehlerhaft. Es gibt zwei Hauptprobleme:
1. Von einem Prototyp, der einen Referenztypwert enthält, wird dieser von allen Instanzen gemeinsam genutzt.
Wie im vorherigen Artikel erwähnt, werden Prototypeigenschaften, die Referenztypwerte enthalten, von allen Instanzen gemeinsam genutzt. Wenn eine Instanz geändert wird, ändern sich andere Instanzen entsprechend, sodass die Eigenschaften im Konstruktor definiert werden müssen. Bei der Vererbung über die Prototypkette werden die Attribute in der Superklasse unabhängig davon, ob sie im Konstruktor oder im Prototyp definiert sind, alle zu Instanzobjekten und werden von der Unterklasse geerbt, was sich auf die Instanzen der Unterklasse auswirkt.
2. Beim Erstellen einer Instanz eines Untertyps können keine Parameter an den Konstruktor des Obertyps übergeben werden.
Durch die Vererbung der Prototypkette wird der Unterklassenprototyp direkt auf die Instanz der Oberklasse verwiesen. Zu diesem Zeitpunkt können Parameter an die Oberklasse übergeben werden. Wenn eine Unterklasse jedoch eine Instanz erstellt, können Parameter nur an den Konstruktor der Unterklasse übergeben werden, nicht jedoch an den Konstruktor der Oberklasse.
Daher wird die Prototypenkette in tatsächlichen Anwendungen selten allein verwendet.

Einige verwandte Codierungspraktiken

Identifizieren Sie ein Prototypattribut

function hasPrototypeProperty(object, name) {
  return name in object && !object.hasOwnProperty(name);
}
Nach dem Login kopieren

Prototypobjekte in Konstruktoren verwenden

function Person(name) {
  this.name = name;
}

Person.prototype = {
  constructor: Person,
  sayName: function () {
    console.log(this.name);
  },
  toString: function() {

  }
};

var person1 = new Person('Nicholas');
var person2 = new Person('Greg);

console.log(person1 instanceof Person); // true
console.log(person1.constructor === Person); // true
console.log(person1.constructor === Object); // false

console.log(person2 instanceof Person); // true
console.log(person2.constructor === Person); // true
console.log(person2.constructor === Object); // false

Nach dem Login kopieren

Objektvererbung

var person1 = {
  name: 'Nicholas',
  sayName: function () {
    console.log(this.name);
  }
};

var person2 = Object.create(person1, {
  name: {
    configurable: true,
    enumerable: true,
    value: 'Greg',
    writable: true
  }
});

person1.sayName(); // Nicholas
person2.sayName(); // Greg

console.log(person1.hasOwnProperty('sayName')); // true
console.log(person1.isPropertyOf(person2)); // true
console.log(person2.hasOwnProperty('sayName')); // false

Nach dem Login kopieren

Modulmodus

var person = (function () {
  var age = 25;

  function getAge() {
    return age;
  }

  function growOlder() {
    age++;
  }

  return {
    name: 'Nicholas',
    getAge: getAge,
    growOlder: growOlder
  };
}());

Nach dem Login kopieren

Bereichskonstruktor

function Person(name) {
  this.name = name;
}

Person.prototype.sayName = function() {
  console.log(this.name);
};

var person1 = Person('Nicholas');

console.log(person1 instanceof Person); // false
console.log(typeof person1); // undefined
console.log(name); // Nicholas

Nach dem Login kopieren
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.

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.

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 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

Genshin Impact Einführung in die neue Karte in Version 4.4 Genshin Impact Einführung in die neue Karte in Version 4.4 Jan 31, 2024 pm 06:36 PM

Mit der Einführung der neuen Karte von Genshin Impact Version 4.4. Freunde, die Version 4.4 von Genshin Impact läutete auch das Sea Lantern Festival in Liyue ein. Gleichzeitig wird in Version 4.4 ein neuer Kartenbereich namens Shen Yu Valley eingeführt. Den bereitgestellten Informationen zufolge ist Shen Yugu tatsächlich Teil des Dorfes Qiaoying, die Spieler sind jedoch eher daran gewöhnt, es Shen Yugu zu nennen. Lassen Sie mich Ihnen nun die neue Karte vorstellen. Einführung in die neue Karte von Genshin Impact Version 4.4. Version 4.4 öffnet „Chenyu Valley·Shanggu“, „Chenyu Valley·Nanling“ und „Laixin Mountain“ im Norden von Liyue Tal·Shanggu" . ※Nach Abschluss des Prologs der Dämonengott-Quest · Akt 3: Der Drache und das Lied der Freiheit wird der Teleportationsankerpunkt automatisch freigeschaltet. 2. Qiaoyingzhuang Als die warme Frühlingsbrise erneut die Berge und Felder von Chenyu streichelte, duftend

„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

Erklärung der C++-Funktionsvererbung: Wie entwirft man eine gute Basis- und abgeleitete Klassenvererbungshierarchie? Erklärung der C++-Funktionsvererbung: Wie entwirft man eine gute Basis- und abgeleitete Klassenvererbungshierarchie? May 03, 2024 am 11:06 AM

Durch die Funktionsvererbung können abgeleitete Klassen Methoden von Basisklassen erben und so die Wiederverwendung von Code und Polymorphismus ermöglichen. Durch den Entwurf einer guten Vererbungshierarchie, die den Prinzipien der Einzelverantwortung, der Offen-Geschlossen-Struktur und der Rees-Substitution folgt, können Codekopplungs- und Rautenprobleme vermieden werden.

See all articles