1. Reserva de conhecimento:
1. Funções que enumeram nomes de atributos:
(1) Para ... In: Você pode atravessar todas as propriedades enumeráveis no objeto (incluindo propriedades próprias e propriedades herdadas) no corpo do loop.
(2) Object.Keys (): Retorna uma matriz (atributos enumeráveis)
(3) Object.GetownPropertyNames (): todas as próprias propriedades
3. Propriedades dos atributos: atributos de dados e atributos de acessórios
(1) Atributos de dados: valor configurável enumerável gravável
O atributo de dados tem apenas um valor simples;
(2) Atributos de acessórios: write (set), leia (get), enumerável, configurável
Os acessórios não são graváveis (ou seja, não há recurso gravável).
Se o atributo tiver um método definido, esse atributo será gravável e existe um método GET, esse atributo será legível.
4. Métodos para definir propriedades de atributo: Object.DefineProperty (objeto, atributo, objeto descritor)
5. Obtenha o objeto descritor da propriedade: Object.TetownPropertyDescriptor (objeto, propriedade)
2. Exemplo
1. De acordo com o uso de para ... em, podemos escrever um método para simular "herança":
<script type = "text/javascript"> var criança = {}; var mãe = {nome: "zhangzhiyying", lastage: 21, sexo: "feminino"}; função estend (alvo, origem) {for (var p na fonte) {target [p] = fonte [p]; } retornar o destino; } estender (criança, mãe); console.log (criança); // <strong> objeto {name: "zhangzhiyying", lastage: 21, sexo: "feminino"} </strong> </script>2. Use para inar as propriedades do objeto de protótipo e atribua valores aos nossos objetos vazios um por um, realizando assim "herança". Essa ideia é muito correta. Vamos modificar o exemplo acima:
<script type = "text/javascript"> var criança = {}; var mãe = {nome: "zhangzhiyying", lastage: 21, <strong> definir idade (valor) {this.lastage = value; }, obtenha a idade () {return this.lastage+1; }, </strong> sexo: "feminino"}; <br> <strong> mãe.age = 15; </strong> // existe um método de conjunto, que possui função gravável estend (alvo, fonte) {for (var p na fonte) {alvo [p] = fonte [p]; } retornar o destino; } estender (criança, mãe); console.log (criança); // <strong> objeto {name: "zhangzhiying", lastage: 15, idade: 16, sexo: "feminino"} </strong> </sCript>Você pode ver que um par de conjuntos é usado no código, obtenha; onde a idade é um atributo de acessador.
O resultado da execução: um objeto normal que não contém conjunto, obtenha.
CONCLUSÃO: A "herança" implementada por para in não lida e obtém, ele converte o atributo de acessador (idade) em um atributo de dados estático.
3. Defina os atributos de dados para o objeto da mãe
<script type = "text/javascript"> var criança = {}; var mãe = {nome: "zhangzhiyying", lastage: 21, defina idade (valor) {this.lastage = value; }, obtenha a idade () {return this.lastage+1; }, sexo: "feminino"}; Object.DefineProperty (Mãe, "Lastage", {Writitable: false}); // Defina o Lastage para não ser uma mãe gravável.age = 15; // Defina inválido, como o valor de Lastage permanece inalterado, o Lastage+1 permanece inalterado, ou seja, a idade permanece uma função inalterada estende (destino, fonte) {for (var p in fonte) {alvo [p] = fonte [p]; } retornar o destino; } estender (criança, mãe); console.log (criança); // objeto {name: "zhangzhiying", lastage: 21, idade: 22, sexo: "feminino"} Child.lastage = 12; // O resultado mostra que o Lastage muda, indicando que a criança. Vamos usar o método getOwnPropertyDesriptor () para confirmar <br> console.log (object.teto<Em id = __ mcedel> </script> </em>
Conclusão: Para alcançar a herança, ainda precisamos resolver o problema -> "herança" características de atributo.
4. Versão completa
<script type = "text/javascript"> var criança = {}; var mãe = {nome: "zhangzhiyying", lastage: 21, defina idade (valor) {this.lastage = value; }, obtenha a idade () {return this.lastage+1; }, sexo: "feminino"}; Object.DefineProperty (Mãe, "Lastage", {Writitable: false}); mãe.age = 15; <Span style = "cor: #333399"> <strong> função estend (destino, origem) {var names = object.getownPropertyNames (fonte); // Obtenha todos os nomes de propriedades para (var i = 0; i <names.length; i ++) {if (nomes [i] no alvo) continue; // Se essa propriedade existir, pule (na herança do protótipo, se o atributo da propriedade e a propriedade do objeto protótipo for duplicada, retenha a própria propriedade) var desc = object.getOwnPropertyDescriptor (fonte, nomes [i]); // Obtenha o objeto descritor do atributo mãe (ou seja, o conjunto de características de atributo, representado pelo objeto descritor em ES5) objeto.DefineProperty (Target, nomes [i], desc); // Obtenha o objeto do descritor da mãe para a definição de atributo da criança} Retornar Target; } </strong> </span> estender (criança, mãe); console.log (criança); Child.Lastage = 12; console.log (object.getownPropertyDescriptor (Child, "Lastage")); console.log (criança); </script>Resultados finais:
Você pode ver claramente a impressão três vezes, a criança "herdada" para definir e obter, o valor do Lastage não mudou e a gravidade também é falsa.
Resumo: Estou lendo o "Guia de autoridade para JavaScript" recentemente. Vou resumir algumas experiências. Se houver algum erro, por favor me corrija, aprenda e faça progresso juntos ~
A explicação detalhada acima da herança do JavaScript usando funções é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.