Heim  >  Artikel  >  Web-Frontend  >  Über neu, fangen wir mit einem FEHLER an

Über neu, fangen wir mit einem FEHLER an

一个新手
一个新手Original
2017-09-26 10:30:251317Durchsuche


Vorwort

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.


Hier kommt das Problem

Unter normalen Umständen ist es unmöglich, 456 auszugeben, also unter welchen Fehlerbedingungen 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)
perfekt, erfolgreich ausgegeben

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)
Toller junger Mann, ich habe darüber nachgedacht, zusammenzuarbeiten, sie arbeiten alle an Getter und Setter und sie alle verarbeiten Daten auf der Metaebene .

Dieser Klassenkamerad hat gleichzeitig einen Artikel gepostet, in dem er sagt, dass er sich von hier inspirieren ließ. Er ist tatsächlich sehr gut geschrieben –> Ich werde auch meine Antwort posten, nur um Spaß zu haben. Warten Sie, einige Leute äußerten ihre Unzufriedenheit und sagten, er sei opportunistisch. Der demo_02-Code entspricht vollständig dem demo_03-Code:

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);
Das macht tatsächlich Sinn. Die Demo_01, die ich geschrieben habe, hat zum Glück nicht die Eingabetaste gedrückt, sonst wäre es mir peinlich gewesen.

Gibt es also eine Möglichkeit, dieses Problem zu lösen und einen echten Output zu erzielen?

456


Was macht der neue Betreiber?


Was ist jetzt unser Problem? Das Problem ist, dass es sich um new Object() handelt, das den this-Zeiger von obj ändert. Gibt es für uns also eine Möglichkeit, dies zu vermeiden?

Was? Wenn Sie mich fragen, warum sich dieser Hinweis geändert hat, kann ich nur sagen, dass Sie JS wirklich gut lernen müssen. Der Schreibstil des Autors ist so interessant >

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!

Stellungnahme:
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
Vorheriger Artikel:JavaScript-AbschlussanalyseNächster Artikel:JavaScript-Abschlussanalyse