Apropos Feature -Marker in JS, ich fühle immer, dass es ein bisschen seltsam ist. Warum sprichst du über dieses Attribut? Es stammt aus einer Frage zu einem Problem. Wir alle wissen, dass das Fensterobjekt tatsächlich ist
Da eine Instanz des Browserfensters eine Instanz ist, sollte diese Instanz "Eigenschaften" und "Methoden" wie folgt haben:
Wenn wir Funktionen verwenden, definieren wir einige Eigenschaften wie Name, Alter usw. und können auch Vorgänge löschen, festlegen und aktualisieren.
Dann ist die folgende Frage. Da der Name meines Personobjekts nach diesem Prinzip dynamisch geändert werden kann, sollte ich auch in der Lage sein, den undefinierten Wert unter Fenster zu ändern, und dann bin ich sehr daran interessiert, einen Blick darauf zu werfen.
Das Ergebnis ist immer noch denkbar. Ich habe den undefinierten Wert nicht erfolgreich geändert. Warum passiert das? Es gibt keinen Grund. Es ist nicht der im vorherige Artikel erwähnte Verpackungstyp, aber wir müssen das Ergebnis respektieren. Dies zeigt, dass der zugrunde liegende JS etwas getan haben muss, um ein solches Ergebnis zu verursachen. Tatsächlich wird in der zugrunde liegenden JS das beschreibbare = falsche Flag standardmäßig verwendet, um das undefinierte Attribut ungeschrieben zu machen. Schauen wir es uns unten ausführlich an.
1: [beschreibbar] Feature
Wenn es darum geht, ob das Attribut beschreibbar ist, können Sie den GET/SET -Accessor in C# oder das Schlüsselwort Readonly vorstellen. Im Folgenden werden Sie auf jeden Fall daran interessiert sein, wie ich den schreibgeschützten Betrieb des Attributs durchführen soll. In JS müssen Sie nur die DefineProperty -Methode verwenden.
Aus dem obigen Beispiel können Sie drei lustige Dinge sehen:
<1>: Ich habe die Definitalproperty-Methode verwendet, um Person.Name in ein schreibgeschütztes Feld zu verwandeln. Jemand möchte sagen, dass dies offensichtlich eine Methode ist, aber wie kann es eine Funktion sein? In meinen Augen ist das Feature
[xxx] Modus, so ist dies der Unterschied zwischen JS. Schließlich hat JS keinen syntaktischen Zucker, sodass die Definitionsmerkmale nur durch die zugrunde liegende öffentliche Methode definiert werden können, dh DefineProperty.
<2>: Ich sehe nicht nur in der Methode beschreibbar, sondern auch ein konfigurierbares. Also, wofür ist das? Tatsächlich ist dies die grundlegende Konfiguration, in der die JS -Engine mitgeteilt wird, ob sie Attribute löschen und aktualisieren können. Wenn ich konfigurierbar auf False festlegt, können Sie P.Name nicht löschen, da dies eine ungültige Operation ist.
Nachdem Sie diese gelesen haben, sollten Sie verstehen, warum undfinierte sie nicht löschen oder aktualisieren können. Sie sind alle aus seltsamen Markierungen. Denkst du, es ist sehr interessant?
<3>: Die nächste Frage, über die es sich lohnt, nachzudenken, ist, wie der JS -Motor es tut. Es gibt auch Attribut in C#, und dieses Attribut wird in Metadaten aufgezeichnet, nachdem sie vom Compiler kompiliert wurden. Dann können Sie Reflexion verwenden, um einen beliebigen Wert in Ihrem Attribut zu erhalten. Zum Beispiel die serialisierbare Serialisierungsklasse, in der serialisierbarformatiert wird, wie die Klasse reflektiert und liest, welche Felder serialisiert werden können und welche nicht, und Sie müssen nicht sserialisierte Tags verwenden.
Die Codekopie lautet wie folgt:
[Serialisierbar]
öffentliche Klassentest
{
[Nicht serialisiert]
öffentlicher String -Name;
}
Aus der Abbildung können wir sehen, dass der Name in IL nicht serialisiert ist. Wir wissen, dass es in JS keine Reflexion gibt, sodass der Durchbruch natürlich in der DefineProperty -Methode liegt. Leider können wir nicht sehen, wie der zugrunde liegende Quellcode dieser Methode aussieht, sodass wir nicht wissen, was er dem Namen des Namens tut, um ihn dynamisch unfehlbar zu machen. Wir können nur das Verhalten erraten, das in der JS -Engine auf der Grundlage unseres Verständnisses auftreten kann.