Heute sah ich in einer Front-End-Gruppe, wie jemand eine Frage postete:
var o = new Object();function foo(obj){ var obj = o; obj.name = '123'; obj = new Object(); obj.name = '456'; } foo(o); console.log(o.name)
Wie im obigen Code gezeigt, if Ist es möglich, „456“ auszugeben, wenn Bedingungen und Daten geändert werden?
Es dauerte nicht lange, bis die Leute in der Gruppe Schlussfolgerungen zogen, die sie unter normalen Umständen nicht ziehen könnten.
Ist der Grund? Jeder, der sich ein wenig mit der Verwendung von Referenztypen auskennt, weiß, dass new Object() den Zeiger von obj ändert und niemals 456 erhalten kann.
Unter normalen Umständen ist es unmöglich, 456 auszugeben, also unter welchen Fehlerbedingungen <🎜 sein kann Ausgabe? Was ist mit >456? Schließlich sind Programmierer gut darin, Fehler zu schreiben. Sie sollten in der Lage sein, ungewöhnliche Situationen zu verursachen.
Dann dachte mein behindertes Ich plötzlich an den Proxy, den ich erst vor zwei Tagen gelernt hatte. Wir haben jetzt ein Problem beim Zuweisen von Werten. Können wir das Problem also anhand von Metadaten lösen? Probieren Sie es aus://demo_01var o = new Object(); o = new Proxy(o,{ set(target, key, value,receiver){ if(Object.is('name',key)) return Reflect.set(target, key, `456`,receiver); return Reflect.set(target, key, value , receiver); } })function foo(obj){ var obj = o; obj.name = '123'; obj = new Object(); obj.name = '456'; } foo(o); console.log(o.name)
456.
Was? Wissen Sie nicht, was ein Proxy ist? Klicken Sie hier –> ES6 Interceptor, Proxy Dann ist es jetzt an der Zeit, die Ergebnisse zu präsentieren, indem Sie sie an die Gruppe senden. Schauen wir uns zunächst den Chatverlauf an. Hehe, jemand hat schon schneller geantwortet als ich. Okay, werfen wir zuerst einen Blick auf die Antworten anderer Leute://demo_02var o = new Object();Object.defineProperty(o,'name',{ set(val){ this.value = '456'; }, get(){ return this.value; } })function foo(obj){ var obj = o; obj.name = '123'; obj = new Object(); obj.name = '456'; } foo(o); console.log(o.name)
Wenn die letzte Codezeile „obj.name = '456';“ in der demo_02-Methode geändert wird, wird „this.value =" in auch der demo_02-Code '456';" muss entsprechend angepasst werden.
//demo_03var o = new Object();function foo(obj){ var obj = o; obj.name = '123'; obj = new Object(); obj.name = '456'; } foo(o); o.name = '456'; console.log(o.name);
Gibt es also eine Möglichkeit, dieses Problem zu lösen und einen echten Output zu erzielen?
456
Was macht der neue Betreiber?
Ich erinnere mich, dass es im Proxy-Handler eine Konstruktmethode gibt, wenn ich diese im Objektkonstruktor ändern kann. Die Idee war gut, aber sie scheiterte und wurde nicht verwirklicht. Wenn jemand mit dieser Idee fortfahren kann, teilen Sie mir bitte die Antwort mit>_< und lassen Sie es das Objekt zurückgeben. Dies hat die Änderung dieses Zeigers vermieden. Er ist so talentiert und ich bewundere ihn. Sammeln Sie im Stillen<_<
Arbeiten Sie hart, es wird immer jemanden geben, der Ihnen etwas beibringen kann
Das obige ist der detaillierte Inhalt vonÜber neu, fangen wir mit einem FEHLER an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!