Der Inhalt dieses Artikels befasst sich mit der Klassenvererbungsanalyse in ECMAScript 6 (mit Beispielen). Ich hoffe, dass er für Sie hilfreich ist.
Klassenvererbung
Bevor Sie sich die Klassenvererbung ansehen, überprüfen Sie zunächst, wie der Konstruktor die Objektvererbung implementiert
function F() { this.a = 1; } function Son() { F.call(this); } function inherit(S, F) { S.prototype = Object.create(F.prototype); S.prototype.constructor = S; } inherit(Son, F); let son = new Son();
Was implementiert er? Funktion :
Erben Sie das Attribut this von F, das das Attribut des F-Instanzobjekts ist
Son.prototype.__proto__ === F.prototype realisiert die Vererbung des Dienstalters
son.constructor ermöglicht es dem Sohn, seine Vorfahren zu erkennen
Verwenden Sie die Schlüsselwörter „extens“ und „super“, um eine einfache Vererbung anzuzeigen
class A { constructor() { this.a = 1; } } class B extends A { constructor() { super(); this.b = 2; } m() { } } let b = new B();
erreicht dies ebenfalls Drei Grundfunktionen
B {a: 1, b: 2} b.__proto__ == B.prototype b.__proto__.__proto__ === A.prototype b.constructor === B
Ich denke: Das Schlüsselwort „extens“ realisiert die Vererbung des Prototyps und die Änderung des Konstruktors; das Schlüsselwort „super“ realisiert die Vererbung der übergeordneten Klasse „this“, und „super“ entspricht hier A. prototyp.constructor.call(this)
Wenn Sie einen Konstruktor schreiben, müssen Sie super darin schreiben, andernfalls meldet das neue Unterklasseninstanzobjekt einen Fehler alle; zweitens muss im Konstruktor der Unterklasse das Attribut this nach super
1 geschrieben werden. Das Wesentliche besteht darin, zuerst das Instanzobjekt this der Unterklasse zu erstellen und dann die Methode hinzuzufügen übergeordnete Klasse zu this (Parent.apply(this)) . ES6
Der Vererbungsmechanismus Ihres eigenen Objekts muss zunächst durch den Konstruktor der übergeordneten Klasse geformt werden, um dieselben Instanzattribute und -methoden wie die übergeordnete Klasse zu erhalten, und dann verarbeitet werden und die eigenen Instanzattribute und -methoden der Unterklasse hinzufügen. Wenn die Supermethode nicht aufgerufen wird, erhält die Unterklasse dieses Objekt nicht.
class B extends A { constructor() { //要么都不写,new时默认会自动生成 super(); this.b = 2; //写在super后面 } m() { } }
A.prototype.constructor.call(this)
ist. Daher können nur Methoden in der Prototypenkette aufgerufen werden und die Methoden und Attribute der übergeordneten Klasseninstanz können nicht verwendet werden. A.prototype
class A { constructor() { this.a = 1; } n() { return this; } } class B extends A { constructor() { super(); this.b = 2; } m() { return super.n(); } } let b = new B(); b === b.m();
constructor{}
kann nicht aufgerufen werden Und es ist festgelegt, dass Wenn die Methode der übergeordneten Klasse in der normalen Methode der Unterklasse über super aufgerufen wird, zeigt dies innerhalb der Methode auf die aktuelle Unterklasseninstanz. Die oben genannte Rückgabe bedeutet also, das Instanzobjekt der Unterklasse zurückzugebenWenn super als Objekt zum Zuweisen von Attributen zu Attributen verwendet wirdsuper entspricht diesem und die zugewiesenen Attribute werden zu Attributen der Unterklasseninstanz
class A { constructor() { this.x = 1; } } class B extends A { constructor() { super(); this.x = 2; super.x = 3; console.log(super.x); // undefined console.log(this.x); // 3 console.log(super.valueOf() instanceof B); //true } } let b = new B();
Nur die Klasse kann die statische Methode der Klasse aufrufen
class A { constructor() { this.a = 1; } static n() { return this; } } class B extends A { constructor() { super(); this.b = 2; } static m() { return super.n(); } } console.log(A.n() === A) // true console.log(B === B.m()); //true
var obj = { toString() { return "MyObject: " + super.toString(); } }; Object.getPrototypeOf(obj).toString = function () { return "这里super等于obj.__proto__"; } console.log(obj.toString()); //MyObject: 这里super等于obj.__proto__
class A { } class B { } // B 的实例继承 A 的实例 Object.setPrototypeOf(B.prototype, A.prototype); // B 继承 A 的静态属性 Object.setPrototypeOf(B, A); const b = new B();
und es6 verwendete Klassen zur Implementierung seine Vererbung,
Codeauszug aus „Erste Schritte mit ES6“
class MyArray extends Array { constructor(...args) { super(...args); } } var arr = new MyArray(); arr[0] = 12; arr.length // 1 arr.length = 0; arr[0] // undefined
class NewObj extends Object{ constructor(){ super(...arguments); } } var o = new NewObj({attr: true}); o.attr === true // false
Das obige ist der detaillierte Inhalt vonKlassenvererbungsanalyse in ECMAScript 6 (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!