Quand je parle des balises de fonctionnalité en js, je me sens toujours un peu bizarre. Alors pourquoi parlons-nous de cet attribut ? Il provient d'une question. Nous savons tous que l'objet window est en fait
.Une instance de la fenêtre du navigateur. Puisqu'il s'agit d'une instance, alors cette instance doit avoir des "propriétés" et des "méthodes", telles que les suivantes :
Lorsque nous utilisons habituellement des fonctions, nous définirons certains attributs, tels que le nom, l'âge, etc., et nous pourrons également effectuer des opérations de suppression, de définition et de mise à jour sur eux.
Ensuite vient la question suivante. Puisque le nom de mon objet personne peut être modifié dynamiquement, selon ce principe, je devrais également pouvoir modifier la valeur non définie sous la fenêtre, et puis je suis très intéressé d'y jeter un œil. .
Le résultat est toujours prévisible. Je n'ai pas réussi à modifier la valeur non définie, alors pourquoi cela se produit-il ? Cela n'a aucun sens. Ce n'est pas le type de packaging mentionné dans l'article précédent, mais il faut respecter le résultat. Cela signifie que la couche inférieure de js doit avoir fait quelque chose pour aboutir à un tel résultat. de js utilise Writable= par défaut. La marque false rend l'attribut non défini inscriptible. Examinons-le en détail.
1 : Fonctionnalité [Écrite]
Lorsque vous demandez si une propriété est accessible en écriture, vous pouvez penser à l'accesseur get/set en C# ou au mot-clé readonly. Vous serez certainement intéressé par la manière dont je dois réaliser le fonctionnement en lecture seule de la propriété. En js, il vous suffit d'utiliser la méthode DefineProperty.
Trois choses intéressantes peuvent être vues à partir de l'exemple ci-dessus :
<1> : J'ai utilisé la méthode definitionProperty pour transformer person.name en un champ en lecture seule. Quelqu'un dira, c'est évidemment une méthode, comment cela peut-il être une fonctionnalité ? 🎜>
Après tout, c'est la différence entre js. , js n'a pas de sucre syntaxique, donc la définition des propriétés ne peut être définie que via la méthode publique sous-jacente, qui est definitionProperty.
<2> : J'ai vu non seulement un élément inscriptible mais également configurable dans la méthode. Qu'est-ce que cela fait ? En fait, il s'agit de la configuration de base, qui indique 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 avoir lu ceci, je pense que vous devriez comprendre pourquoi undiffed ne peut pas être supprimé ou mis à jour. Ils sont tous faits de marques étranges. Vous ne trouvez pas cela intéressant ?
<3> : La prochaine question à laquelle il convient de réfléchir est de savoir comment le moteur js le fait. Il existe également Atrribute en C#, et cet Atrribute sera enregistré dans les métadonnées après avoir été compilé par le compilateur, et vous pourrez ensuite le ressentir. libre d'utiliser la réflexion pour obtenir n'importe quelle valeur dans votre attribut, telle que la classe de sérialisation Serialisable. Elle indique à SeriallesslyFormat comment lire la classe de manière réfléchie, quels champs peuvent être sérialisés et lesquels ne le peuvent pas. Sinon, vous devez utiliser la marque NonSerialized.
Vous pouvez voir sur l'image que la fonctionnalité Name is not sérialized a été enregistrée dans IL. Nous savons qu'il n'y a pas de réflexion dans js, donc la percée se situe naturellement dans la méthode DefineProperty, mais malheureusement, nous ne pouvons pas voir le sous-jacent. code source de cette méthode. À quoi cela ressemble-t-il exactement, donc je ne sais pas ce que cela fait au champ Nom pour le rendre dynamiquement illisible. Je ne peux que deviner le comportement possible du moteur js en fonction de la compréhension.