DefinitionDer neue Operator erstellt eine Instanz eines benutzerdefinierten Objekttyps oder eine Instanz eines integrierten Objekts mit einem Konstruktor. Verwenden Sie die neue Methode [Konstruktor], um eine Objektinstanz zu erstellen. Unterschiede in den Konstruktoren führen jedoch dazu, dass unterschiedliche Instanzen erstellt werden. Konstruktorkörper sind unterschiedlichEin Konstruktor ist auch eine Funktion. Der einzige Unterschied ist die aufrufende Methode. Jede Funktion, die mit dem neuen Operator aufgerufen wird, ist ein Konstruktor, und eine Funktion, die nicht mit dem neuen Operator aufgerufen wird, ist eine normale Funktion. Der Konstruktor kann daher auch einen Rückgabewert haben, was jedoch zu anderen Ergebnissen für new führt. Kein RückgabewertFunktion Person(Name) { dieser.name = Name; } let obj = neue Person("Jalenl"); konsole.log(obj); Offensichtlich wird {name:'Jalenl'} gedruckt. RückgabeobjektFunktion Person(Alter) { dieses.Alter = Alter; return { Name: "Jalenl" }; } let obj = neue Person(18); konsole.log(obj); Gedruckt wird {name:'Jalenl'}, was bedeutet, dass alle Definitionen vor der Rückgabe überschrieben werden. Was hier zurückgegeben wird, ist ein Objekt. Was ist, wenn es ein Basistyp ist? Gibt Nicht-Objekte zurückFunktion Person(Alter) { dieses.Alter = Alter; Rückgabe 1; } let obj = neue Person(18); konsole.log(obj); Gibt {age:21} zurück, was bedeutet, dass die Rückgabe ungültig ist und das Ergebnis dasselbe ist, als ob es keine Rückgabe gäbe. Was passiert, wenn dieses gebundene interne Attribut nicht vorhanden ist und der grundlegende Datentyp zurückgegeben wird? Keine Eigenschaftsbindung + gibt Nicht-Objekt zurückFunktion Person(){ Rückgabe 1 } neue Person() Der zurückgegebene Wert ist wie erwartet ein leeres Objekt {}. Zusammenfassend lässt sich sagen, dass das ursprüngliche Ergebnis nur geändert werden kann, wenn der Konstruktor einen Objekttyp zurückgibt. Konstruktortypen sind unterschiedlich Der Konstruktor ist eine normale FunktionDie Spezifikation ECMA-262 3. Ausgabe beschreibt den Prozess zum Erstellen einer Objektinstanz:
Um zusammenzufassen:
Im fünften Schritt wurde bereits erklärt, warum unterschiedliche Konstruktoren zu unterschiedlichen neuen Ergebnissen führen. Nachfolgend finden Sie eine Erklärung von MDN:
Der Konstruktor ist eine PfeilfunktionWenn eine normale Funktion erstellt wird, erstellt die Engine gemäß bestimmten Regeln eine Prototypeigenschaft (die auf das Prototypobjekt verweist) für diese Funktion. Standardmäßig erhalten alle Prototypobjekte automatisch eine Eigenschaft namens „Konstruktor“, die auf den ihnen zugeordneten Konstruktor zurückverweist. Funktion Person(){ dieses.Alter = 18; } Person.Prototyp /** { Konstruktor: ƒ Foo() __proto__: Objekt } **/ Beim Erstellen einer Pfeilfunktion erstellt die Engine keine Prototypeigenschaft dafür. Die Pfeilfunktion hat keinen Konstruktor, den new aufrufen kann. Wenn Sie also new zum Aufrufen der Pfeilfunktion verwenden, tritt ein Fehler auf! const Person = ()=>{} new Person() // TypeError: Foo ist kein Konstruktor Handschriftlich neuZusammenfassend lässt sich sagen, dass wir, nachdem wir uns mit dem Funktionsprinzip von new vertraut gemacht haben, eine Low-Profile-Version von new selbst implementieren können. Der Schlüssel zur Implementierung ist:
Funktion _new(Konstruktor, ...args) { // Konstruktortyp Rechtsurteil if(typeof Konstruktor !== 'Funktion') { throw new Error('Konstruktor muss eine Funktion sein'); } //Erstellen Sie eine neue leere Objektinstanz let obj = new Object(); // Binden Sie den Prototyp des Konstruktors an die neu erstellte Objektinstanz obj.__proto__ = Object.create(constructor.prototype); // Konstruktor aufrufen und Rückgabewert ermitteln let res = constructor.apply(obj, args); let isObject = typeof res === 'Objekt' und res !== null; let isFunction = Typ von res === 'Funktion'; // Wenn ein Rückgabewert vorhanden ist und es sich um einen Objekttyp handelt, dann verwende ihn als Rückgabewert, andernfalls gib das zuvor erstellte Objekt zurück return isObject || isFunction ? res : obj; }; Diese neue Low-Profile-Implementierung kann zum Erstellen von Instanzen benutzerdefinierter Klassen verwendet werden, unterstützt jedoch keine integrierten Objekte. Schließlich ist new ein Operator und die zugrunde liegende Implementierung ist komplizierter. ZusammenfassenDies ist das Ende dieses Artikels über das Prinzip und die Implementierung von new in JS. Weitere relevante Inhalte zum Prinzip und zur Implementierung von new in JS finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
>>: Gestaltung von Popup-Fenstern und schwebenden Ebenen im Webdesign
Dieser Artikel fasst gängige Betriebstechniken fü...
Inhaltsverzeichnis verwenden Verwendung von EsLin...
MySQL-Leistungsoptimierung MySQL wird in Internet...
Hintergrund Apropos MySQL-Deadlock: Ich habe bere...
Kapitel 1: Einführung in Keepalived Der Zweck des...
Schauen Sie sich zuerst die Lösung an #----------...
Hafen Harbor ist eine Open-Source-Lösung zum Erst...
In diesem Artikel wird das Deep-Learning-Framewor...
Docker Compose ist ein Docker-Tool zum Definieren...
In der Vergangenheit wurde Float häufig für das L...
Inhaltsverzeichnis 1. Installation 2. Importieren...
Hintergrund In letzter Zeit werde ich in Intervie...
Wie der Titel schon sagt: Die Höhe ist bekannt, d...
MySQL-Datenbank stürzt nach Eingabe von Passwort ...
Installieren Sie zunächst PHP5 ganz einfach yum i...