Falando dos marcadores de recursos em JS, sempre sinto que é um pouco estranho. Por que você fala sobre esse atributo? Ele se originou de uma pergunta sobre um problema. Todos sabemos que o objeto da janela é realmente
Como uma instância da janela do navegador é uma instância, esta instância deve ter "propriedades" e "métodos", como os seguintes:
Quando usamos funções, definimos algumas propriedades, como nome, idade etc., e também podemos excluir, definir e atualizar operações nelas.
Então a seguinte pergunta é. Como o nome do meu objeto de pessoa pode ser modificado dinamicamente, de acordo com esse princípio, também devo ser capaz de modificar o valor indefinido na janela e, em seguida, estou muito interessado em dar uma olhada.
O resultado ainda é concebível. Não modifiquei com sucesso o valor indefinido, então por que isso está acontecendo? Não há razão. Não é o tipo de embalagem mencionado no artigo anterior, mas precisamos respeitar o resultado. Isso mostra que o JS subjacente deve ter feito algo para causar esse resultado. De fato, no JS subjacente, o sinalizador gravável = falso é usado por padrão para tornar o atributo indefinido não escrito. Vamos dar uma olhada nele em detalhes abaixo.
1: [gravidade] Recurso
Quando se trata de se o atributo é gravável, você pode pensar no acessador GET/Set em C# ou na palavra -chave readonly. Abaixo, você definitivamente estará interessado em como eu deveria fazer a operação somente leitura do atributo. No JS, você só precisa usar o método DefineProperty.
Do exemplo acima, você pode ver três coisas divertidas:
<1>: usei o método DefineProperty para transformar a pessoa.name em um campo somente leitura. Alguém quer dizer que este é obviamente um método, mas como pode ser um recurso? Na minha opinião, o recurso é
[xxx] Modo, então essa é a diferença entre JS. Afinal, o JS não possui açúcar sintático; portanto, as características de definição só podem ser definidas através do método público subjacente, ou seja, definição de propósito.
<2>: Não vejo apenas gravidade no método, mas também um configurável. Então, para que serve isso? De fato, esta é a configuração básica, informando ao mecanismo JS se ele pode excluir e atualizar atributos. Quando eu configuro configurável como falso, você não pode excluir o P.Name, porque esta será uma operação inválida.
Depois de ler isso, acho que você deve entender por que a indiferença não pode excluir ou atualizar. Eles são todos feitos de marcas estranhas, você acha que é muito interessante?
<3>: A próxima pergunta que vale a pena pensar é como o mecanismo JS faz isso. Há também atributo em C#, e esse atributo será registrado em metadados após ser compilado pelo compilador. Então você pode usar a reflexão para obter qualquer valor em seu atributo. Por exemplo, a classe de serialização serializável, que informa ao SerializableFormat como refletir e ler a classe, quais campos podem ser serializados e que não podem, e você precisa usar tags não serineralizadas.
A cópia do código é a seguinte:
[Serializável]
Teste de classe pública
{
[Não -serializado]
Nome de String Public;
}
A partir da figura, podemos ver que o nome é notário em IL. Sabemos que não há reflexão no JS; portanto, o avanço está naturalmente no método DefineProperty. Infelizmente, não podemos ver como é o código -fonte subjacente desse método; portanto, não sabemos o que ele faz com o campo de nome para torná -lo inútil. Só podemos adivinhar o comportamento que pode ocorrer no mecanismo JS com base em nosso entendimento.