Hablando de los marcadores de características en JS, siempre siento que es un poco extraño. ¿Por qué hablas de este atributo? Se originó a partir de una pregunta sobre un problema. Todos sabemos que el objeto de la ventana es en realidad
Dado que una instancia de la ventana del navegador es una instancia, esta instancia debe tener "propiedades" y "métodos", como los siguientes:
Cuando usamos funciones, definimos algunas propiedades, como el nombre, la edad, etc., y también podemos eliminar, establecer y actualizar las operaciones en ellas.
Entonces la siguiente pregunta es. Dado que el nombre del objeto de mi persona se puede modificar dinámicamente, de acuerdo con este principio, también debería poder modificar el valor indefinido debajo de la ventana, y luego estoy muy interesado en echar un vistazo.
El resultado sigue siendo concebible. No he modificado con éxito el valor indefinido, entonces, ¿por qué está sucediendo esto? No hay razón. No es el tipo de embalaje mencionado en el artículo anterior, pero tenemos que respetar el resultado. Esto muestra que el JS subyacente debe haber hecho algo para causar tal resultado. De hecho, en el JS subyacente, la bandera de WRATITS = FALSE se usa de forma predeterminada para que el atributo indefinido no sea escrito. Echemos un vistazo en detalle a continuación.
1: característica [de escritura]
Cuando se trata de si el atributo es WRITITY, puede pensar en el accesor GET/SET en C# o la palabra clave Readonly. A continuación, definitivamente estará interesado en cómo debería hacer la operación de solo lectura del atributo. En JS, solo necesita usar el método DefineProperty.
Del ejemplo anterior, puede ver tres cosas divertidas:
<1>: Utilicé el método DefineProperty para convertir la persona. Nombre en un campo de solo lectura. Alguien quiere decir que esto es obviamente un método, pero ¿cómo puede ser una característica? En mi opinión, la característica es
Modo [xxx], entonces esta es la diferencia entre JS. Después de todo, JS no tiene azúcar sintáctica, por lo que las características de definición solo se pueden definir a través del método público subyacente, es decir, definir la propiedad.
<2>: No solo veo Writable en el método, sino también un configurable. Entonces, ¿para qué es esto? De hecho, esta es la configuración básica, que le dice al motor JS si puede eliminar y actualizar los atributos. Cuando configuré configurable en falso, no puede eliminar P.Name, porque esta será una operación no válida.
Después de leerlos, creo que debes entender por qué no se puede eliminar o actualizar. Todos están hechos de marcas extrañas, ¿crees que es muy interesante?
<3>: La siguiente pregunta que vale la pena pensar es en cómo lo hace el motor JS. También hay un atributo en C#, y este atributo se registrará en metadatos después de ser compilado por el compilador. Luego puede usar Reflexión para obtener cualquier valor en su atributo. Por ejemplo, la clase de serialización serializable, que le dice a SerializableFormat cómo reflejar y leer la clase, qué campos pueden ser serializados, y que no puede, y necesita usar etiquetas no serializadas.
La copia del código es la siguiente:
[Serializable]
prueba de clase pública
{
[No se usa]
nombre de cadena pública;
}
De la figura, podemos ver que el nombre no se puede serserializado en IL. Sabemos que no hay reflejo en JS, por lo que el avance es naturalmente en el método DefineProperty. Desafortunadamente, no podemos ver cómo es el código fuente subyacente de este método, por lo que no sabemos cómo hace al campo de nombre para que sea dinámicamente nocturno. Solo podemos adivinar el comportamiento que puede ocurrir en el motor JS en función de nuestra comprensión.