En parlant des marqueurs de fonctionnalités dans JS, je pense toujours que c'est un peu étrange. Pourquoi parlez-vous de cet attribut? Il est né d'une question sur un problème. Nous savons tous que l'objet de fenêtre est en fait
Puisqu'une instance de la fenêtre du navigateur est une instance, cette instance doit avoir des "propriétés" et des "méthodes", comme les suivantes:
Lorsque nous utilisons des fonctions, nous définissons certaines propriétés, telles que le nom, l'âge, etc., et nous pouvons également supprimer, définir et mettre à jour les opérations.
Alors la question suivante est. Étant donné que le nom de mon objet de personne peut être modifié dynamiquement, selon ce principe, je devrais également être en mesure de modifier la valeur non définie sous la fenêtre, puis je suis très intéressé à jeter un œil.
Le résultat est toujours concevable. Je n'ai pas réussi à modifier la valeur non définie, alors pourquoi cela se produit-il? Il n'y a aucune raison. Ce n'est pas le type d'emballage mentionné dans l'article précédent, mais nous devons respecter le résultat. Cela montre que le JS sous-jacent doit avoir fait quelque chose pour provoquer un tel résultat. En fait, dans le js sous-jacent, le drapeau écrivable = faux est utilisé par défaut pour rendre l'attribut non défini non écrit. Jetons un œil à cela en détail ci-dessous.
1: fonctionnalité [écrivative]
Lorsqu'il s'agit de savoir si l'attribut est écrit, vous pouvez penser à l'accessoire GET / SET dans C # ou le mot-clé ReadOnly. Ci-dessous, vous serez certainement intéressé par la façon dont je devrais effectuer le fonctionnement en lecture seule de l'attribut. Dans JS, il vous suffit d'utiliser la méthode DefineProperty.
D'après l'exemple ci-dessus, vous pouvez voir trois choses amusantes:
<1>: J'ai utilisé la méthode DefineProperty pour transformer Person.name en un champ en lecture seule. Quelqu'un veut dire que c'est évidemment une méthode, mais comment peut-il être une fonctionnalité? Dans mon esprit, la fonctionnalité est
[xxx] Mode, c'est donc la différence entre JS. Après tout, JS n'a pas de sucre syntaxique, de sorte que les caractéristiques de définition ne peuvent être définies que par la méthode publique sous-jacente, c'est-à-dire de définir.
<2>: Je ne vois pas seulement Writable dans la méthode, mais aussi un configurable. Alors, à quoi sert-il? En fait, c'est la configuration de base, indiquant au moteur JS s'il peut supprimer et mettre à jour les attributs. Lorsque je définis configurable sur false, vous ne pouvez pas supprimer P.Name, car ce sera une opération non valide.
Après les avoir lus, je pense que vous devez comprendre pourquoi non plus ne peut pas supprimer ou mettre à jour. Ils sont tous faits de marques étranges, pensez-vous que c'est très intéressant?
<3>: La question suivante qui mérite d'être réfléchie est de savoir comment le moteur JS le fait. Il y a également un attribut dans C #, et cet attribut sera enregistré dans les métadonnées après avoir été compilé par le compilateur. Ensuite, vous pouvez utiliser la réflexion pour obtenir n'importe quelle valeur dans votre attribut. Par exemple, la classe de sérialisation sérialisable, qui indique à SerializableFormat comment refléter et lire la classe, quels champs peuvent être sérialisés, et qui ne peuvent pas, et vous devez utiliser des balises non sérialisées.
La copie de code est la suivante:
[Sérialisable]
test de classe publique
{
[Non ssérialisé]
nom de chaîne publique;
}
D'après la figure, nous pouvons voir que le nom n'est passérialisé en IL. Nous savons qu'il n'y a pas de réflexion dans JS, donc la percée est naturellement dans la méthode DefineProperty. Malheureusement, nous ne pouvons pas voir à quoi ressemble le code source sous-jacent de cette méthode, nous ne savons donc pas ce qu'il fait dans le champ Nom pour le rendre dynamiquement inutile. Nous ne pouvons que deviner le comportement qui peut se produire dans le moteur JS en fonction de notre compréhension.