1. Was ist Reflexion? Das Konzept der Reflexion existiert in vielen Programmiersprachen, beispielsweise Bei der objektorientierten Programmierung werden in der Regel zuerst Klassen und Methoden definiert und dann Objekte erstellt, um Methoden explizit aufzurufen, wie im folgenden Beispiel: öffentliche Klasse Benutzer{ privater String-Name; privates Datum Geburtstag; //.... public int berechneAlterNachGeburtstag(){ // ..... } } // Benutzer aufrufen u = neuer Benutzer("jack", neues Datum()); u.calculateAgeByBirthday(); Wir sind mit der obigen Aufrufmethode vertraut. Wenn Sie jedoch abstrakte Frameworks schreiben möchten (die Frameworks müssen mit geschäftsdefinierten Klassen zusammenarbeiten), wird Reflektion verwendet, um Mitgliedsvariablen dynamisch abzurufen oder Methoden aufzurufen, da Sie die Mitglieder und Methoden der Geschäftsklassen nicht kennen. Im folgenden Beispiel verwenden wir Reflexion, um JSON in ein Java-Objekt zu konvertieren. öffentliche statische Klasse Benutzer { privater String-Name; öffentliche Zeichenfolge getName() { Rückgabename; } öffentliche void setName(String name) { dieser.name = Name; } } // Verwenden Sie Reflektion, um die Objekt-Setter-Methode aufzurufen. öffentliche statische <T> T füllen (Klasse <T> Benutzerklasse, Map <String, Objekt> json) wirft Ausnahme { Feld[] Felder = userClass.getDeclaredFields(); T Benutzer = Benutzerklasse.neueInstanz(); für (Feld Feld : Felder) { // Den ersten Buchstaben groß schreiben String name = field.getName(); char[] arr = name.toCharArray(); arr[0] = Character.toUpperCase(arr[0]); System.out.println(neuer String(arr)); Methode method = userClass.getDeclaredMethod("set" + new String(arr), field.getType()); Objekt returnValue = method.invoke(Benutzer, json.get(Name)); } Benutzer zurückgeben; } 2. Reflektieren in JavaScript
2.1 Reflect.get(Ziel, Name, Empfänger) Die Methode const obj = { Name: 'Jack', Alter: 12, erhalte Benutzerinformationen () { returniere diesen Namen + „Alter ist“ + dieses Alter; } } Reflect.get(obj, 'name') // Buchse Reflect.get(obj, 'Alter') // 12 Reflect.get(obj, 'userInfo') // Jack ist 12 Jahre alt // Wird beim Aufruf der Funktion userInfo() der Receiver-Parameter übergeben, so bezieht sich dieser auf das Empfängerobjekt. const EmpfängerObj = { Name: 'Xiaoming', Alter: 22 }; Reflect.get(obj, 'userInfo', receiverObj) // Xiaoming ist 22 Jahre alt 2.2 Reflect.set(Ziel, Name, Wert, Empfänger) const obj = { Name: 'Jack', Alter: 12, setze updateAge(Wert) { gib this.age = Wert zurück; }, } Reflect.set(Objekt, 'Alter', 22); obj.age // 22 // Wird beim Aufruf der Funktion updateAge() der Receiver-Parameter übergeben, so bezieht sich dieser auf das Receiver-Objekt. const EmpfängerObj = { Alter: 0 }; Reflect.set(Objekt, 'Aktualisierungsalter', 10, Empfängerobjekt) // obj.age // 22 Empfängerobjekt.Alter // 10 2.3 Reflect.has(Objekt, Name) const obj = { Name: 'Jack', } obj im Namen // wahr Reflect.has(Objekt, 'Name') // wahr 2.4 Reflect.deleteProperty(Objekt, Name) const obj = { Name: 'Jack', } Objektnamen löschen Reflect.deleteProperty(Objekt, 'Name') 2.5 Reflect.construct(Ziel, Argumente) Die Methode Funktion Benutzer(Name){ dieser.name = Name; } const Benutzer = neuer Benutzer('Jack'); Reflect.construct(Benutzer, ['jack']); Reflect.getPrototypeOf(obj) Die Methode Reflect.getPrototypeOf wird verwendet, um die __proto__-Eigenschaft eines Objekts zu lesen. 2.6 Reflect.setPrototypeOf(Objekt, neuesProto) Mit const obj = { Name: 'Jack', } Reflect.setPrototypeOf(obj, Array.prototype); obj.länge // 0 2.7 Reflect.apply(Funktion, diesesArg, Argumente) Die Methode Konstante Nums = [1,2,3,4,5]; const min = Math.max.apply(Math, nums); // Aufgerufen über Reflect.apply const min = Reflect.apply(Math.min, Math, nums); 2.8 Reflect.defineProperty(Ziel, Eigenschaftsschlüssel, Attribute) const obj = {}; Object.defineProperty(obj, 'Eigenschaft', { Wert: 0, beschreibbar: false }); Reflect.defineProperty(Objekt, 'Eigenschaft', { Wert: 0, beschreibbar: false }); 2.9 Reflect.getOwnPropertyDescriptor(Ziel, Eigenschaftsschlüssel)
2.10 Reflect.isExtensible (Ziel)
2.11 Reflect.preventExtensions(Ziel)
2.13 Reflect.ownKeys (Ziel) const obj = { Name: 'Jack', Alter: 12, erhalte Benutzerinformationen () { returniere diesen Namen + „Alter ist“ + dieses Alter; } } Objekt.getOwnPropertyNames(obj) Reflect.ownKeys(obj) // ['Name', 'Alter', 'Benutzerinfo'] 3. Proxy in JavaScriptProxys sind beim Programmieren sehr nützlich. Sie können vor dem Zielobjekt eine „Abfangebene“ hinzufügen, um eine gemeinsame Logik zu implementieren.
const user = {name: 'hallo'} const proxy = neuer Proxy(Benutzer, { get: function(target, property) { // Wird beim Lesen der Eigenschaft ausgelöst return 'hi'; } }); Proxy.name // "hallo" 3.1 Im Proxy unterstützte Abfangvorgänge
3.2 get() Es wird verwendet, um den Lesevorgang eines bestimmten Attributs abzufangen. Es kann drei Parameter akzeptieren, nämlich das Zielobjekt, den Attributnamen und const Benutzer = { Name: 'Jack' } //Gibt nur dann einen Wert zurück, wenn das Attribut vorhanden ist, andernfalls wird eine Ausnahme ausgelöst. const proxy = neuer Proxy(Benutzer, { get: Funktion(Ziel, Eigenschaft) { if (!(Eigenschaft im Ziel)) { throw new ReferenceError(`${property} existiert nicht.`); } Ziel [Eigenschaft] zurückgeben; } }); Proxy.Name // Buchse proxy.age // ReferenceError: Alter existiert nicht. Wir können einige allgemeine Proxy-Objekte definieren und diese dann an untergeordnete Objekte erben lassen. //Gibt nur dann einen Wert zurück, wenn das Attribut vorhanden ist, andernfalls wird eine Ausnahme ausgelöst. const proxy = neuer Proxy({}, { get: Funktion(Ziel, Eigenschaft) { if (!(Eigenschaft im Ziel)) { throw new ReferenceError(`${property} existiert nicht.`); } Ziel [Eigenschaft] zurückgeben; } }); let obj = Objekt.erstellen(Proxy); obj.name = "hallo" obj.name // hallo obj.age // ReferenceError: Alter existiert nicht. 3.3 einstellen() Es wird verwendet, um die Zuweisungsoperation eines bestimmten Attributs abzufangen. Es kann vier Parameter akzeptieren, nämlich das Zielobjekt, den Attributnamen, den Attributwert und // Prüfung der Länge des Zeichentyp-Attributs let sizeValidator = { set: Funktion(Ziel, Eigenschaft, Wert, Empfänger) { wenn (Typ des Wertes == 'Zeichenfolge' und Wert.Länge > 5) { throw new RangeError('Darf nicht länger als 5 Zeichen sein.'); } Ziel[Eigenschaft] = Wert; gibt true zurück; } }; const validator = neuer Proxy({}, sizeValidator); let obj = Objekt.create(validator); obj.name = '123456' // RangeError: Darf nicht länger als 5 Zeichen sein. obj.age = 12 // 12 3.4 hat() Wird verwendet, um den Es akzeptiert zwei Parameter, das Zielobjekt und den abzufragenden Attributnamen. const handler = { hat (Ziel, Schlüssel) { wenn (Schlüssel[0] === '_') { gibt false zurück; } Eingabetaste im Ziel; } }; var Ziel = { _prop: 'foo', prop: 'foo' }; var Proxy = neuer Proxy (Ziel, Handler); '_prop' im Proxy // falsch 3.5 defineProperty()
3.6 deleteProperty()
3.7 getOwnPropertyDescriptor()
3.8 getPrototypeOf()Es wird hauptsächlich zum Abfangen und Erhalten des Objektprototyps verwendet. Der Abfangvorgang ist wie folgt:
const obj = {}; const proto = {}; const handler = { getPrototypeOf(Ziel) { konsole.log(ziel === obj); // wahr konsole.log(dieser === handler); // wahr Prototyp zurückgeben; } }; const p = neuer Proxy(Objekt, Handler); console.log(Object.getPrototypeOf(p) === proto); // wahr 3.9 setPrototypeOf() Wird hauptsächlich verwendet, um const handlerReturnsFalse = { setzePrototyp von(Ziel, neuesProto) { gibt false zurück; } }; const newProto = {}, Ziel = {}; const p1 = neuer Proxy (Ziel, Handler gibt Falsch zurück); Object.setPrototypeOf(p1, newProto); // wirft einen TypeError Reflect.setPrototypeOf(p1, newProto); // gibt false zurück 3.10 istErweiterbar()Die Methode fängt die Operation Object.isExtensible() ab. const p = neuer Proxy({}, { isExtensible: Funktion(Ziel) { console.log('aufgerufen'); return true; //Sie können auch 1; usw. zurückgeben, um den Wert von true darzustellen} }); console.log(Object.isExtensible(p)); // "aufgerufen" // WAHR 3.11 ownKeys()Wird verwendet, um den Lesevorgang der eigenen Attribute des Objekts abzufangen. Im Einzelnen werden folgende Vorgänge abgefangen.
const p = neuer Proxy({}, { ownKeys: Funktion(Ziel) { console.log('aufgerufen'); zurückgeben ['a', 'b', 'c']; } }); console.log(Object.getOwnPropertyNames(p)); // "aufgerufen" 3.12 preventExtensions() Wird verwendet, um Diese Methode unterliegt einer Einschränkung: const p = neuer Proxy({}, { preventExtensions: Funktion(Ziel) { console.log('aufgerufen'); Objekt.preventExtensions(Ziel); gibt true zurück; } }); console.log(Object.preventExtensions(p)); // "aufgerufen" // FALSCH 3.13 anwenden()Die Apply-Methode fängt die folgenden Vorgänge ab.
Es akzeptiert drei Parameter: das Zielobjekt, das Kontextobjekt des Zielobjekts (dieses) und das Parameterarray des Zielobjekts. const handler = { anwenden (Ziel, CTX, Argumente) { gibt Reflect.apply(...Argumente) zurück; } }; Beispiel: const Ziel = Funktion () { }; const handler = { anwenden: Funktion (Ziel, diesesArg, Argumentliste) { console.log('aufgerufen: ' + argumentsList.join(', ')); returniere Argumentliste[0] + Argumentliste[1] + Argumentliste[2]; } }; const p = neuer Proxy (Ziel, Handler); p(1,2,3) // "aufgerufen: 1, 2, 3" 6 3.14 Konstrukt() Wird verwendet, um const handler = { Konstrukt (Ziel, Argumente, neues Ziel) { gib neues Ziel zurück (... Argumente); } }; Diese Methode akzeptiert drei Parameter.
Hinweis: Die Methode muss ein Objekt zurückgeben und das Zielobjekt muss eine Funktion sein, andernfalls wird ein Fehler gemeldet. const p = neuer Proxy(Funktion() {}, { Konstrukt: Funktion(Ziel, Argumentliste) { gebe 0 zurück; } }); new p() // Der Rückgabewert ist kein Objekt, es wird ein Fehler gemeldet const p = new Proxy({}, { Konstrukt: Funktion(Ziel, Argumentliste) { zurückkehren {}; } }); new p() //Das Zielobjekt ist keine Funktion, Fehler 4. BeobachtermusterObserver ist ein sehr verbreitetes Muster, das so definiert ist, dass bei einer Zustandsänderung eines Objekts alle davon abhängigen Objekte benachrichtigt und automatisch aktualisiert werden. Wir verwenden Beobachterfunktion, umschließt das Beobachtungsziel und fügt die Beobachtungsfunktion hinzu.
const queuedObservers = neues Set(); const observe = fn => queuedObservers.add(fn); const observable = obj => neuer Proxy(obj, {set}); //Bei einer Eigenschaftsänderung die Beobachtungsfunktion automatisch ausführen. Funktionssatz (Ziel, Schlüssel, Wert, Empfänger) { const Ergebnis = Reflect.set(Ziel, Schlüssel, Wert, Empfänger); queuedObservers.forEach(Beobachter => Beobachter()); Ergebnis zurückgeben; } Beispiel: const Benutzer = beobachtbar({ Name: 'Jack', Alter: 20 }); Funktion Benutzerinfo() { console.log(`${Benutzername}, ${Benutzeralter}`) } beobachten(Benutzerinfo); Benutzername = "Xiaoming"; // Xiaoming, 20 Damit ist dieser Artikel über Reflexion und Proxy in Front-End Das könnte Sie auch interessieren:
|
<<: So trennen Sie statischen und dynamischen Status durch die Kombination von Apache und Tomcat
>>: MySQL-Primärschlüssel-Benennungsstrategie im Zusammenhang
Inhaltsverzeichnis Anwendungsfälle Reaktive API-b...
Awk ist eine Anwendung zur Verarbeitung von Textd...
Vor Kurzem habe ich gelernt, mit Nginx statische ...
Dieser Artikel veranschaulicht anhand eines Beisp...
In diesem Artikelbeispiel wird der spezifische Co...
So deklarieren Sie einen Cursor in MySQL: 1. Vari...
Ich spiele in letzter Zeit mit Big Data. Ein Freu...
Frage Wie greife ich in Docker auf die lokale Dat...
Inhaltsverzeichnis Vue-Monitoreigenschaften Was i...
Ich weiß nicht, ob Sie schon einmal in eine solch...
Dieser Artikel stellt hauptsächlich den Kreisdiag...
Vor kurzem habe ich ein Projekt, bei dem ich mit i...
HTML-Formulare werden verwendet, um verschiedene ...
Inhaltsverzeichnis Szeneneinführung Plugin-Implem...
Weiterleitung zwischen zwei verschiedenen Servern...