O JavaScript é a única linguagem amplamente usada para herança de protótipos, por isso leva tempo para entender as diferenças entre os dois métodos de herança.
A primeira grande diferença é que o JavaScript usa cadeias de protótipo para herdar:
function foo () {this.value = 42;} foo.prototype = {método: function () {}}; barra de função () {}Definir o protótipo da barra para a instância do objeto de Foo:
Bar.prototype = new Foo (); bar.prototype.foo = 'Hello World';
Certifique -se de que o construtor da barra seja próprio e crie uma nova instância de objeto de barra:
Bar.prototype.constructor = bar; var test = new bar ();
Vamos dar uma olhada na composição de toda a cadeia de protótipo:
teste [instância do bar] bar.prototype [instância de foo] {foo: 'hello world'} foo.prototype {métod: ...} object.prototype {tostring: ... / * etc. * /}No exemplo acima, o teste do objeto herdará o bar.prototype e o foo.prototype. Portanto, ele pode acessar o método de função definido no Foo. Obviamente, também pode acessar o valor da propriedade. Deve -se mencionar que, quando o New Bar () não é criado, uma nova instância do Foo é reutilizada, mas a instância do Foo que vem com seu objeto de protótipo. Da mesma forma, todas as instâncias da barra compartilham o mesmo atributo de valor. Vamos dar exemplos:
test1 = new bar (); test2 = new bar (); Bar.prototype.value = 41; test1.value // 41 test2.Value // 41
Mecanismo de pesquisa em cadeia de protótipo
Ao acessar as propriedades de um objeto, o JavaScript atravessará toda a cadeia de protótipo do próprio objeto até encontrar as propriedades correspondentes. Se você atingir a parte superior da cadeia de protótipo, que é o objeto.Prototipo no exemplo acima e ainda não há atributos a serem encontrados, o JavaScript retornará o valor indefinido.
Propriedades dos objetos de protótipo
Embora as propriedades do objeto de protótipo sejam usadas pelo JavaScript para construir a cadeia de protótipo, ainda podemos atribuir valores a ele. Mas copiar o valor original do protótipo é inválido, como:
function foo () {} foo.prototype = 1; // sem efeitoAqui está uma distração deste artigo e apresente qual é o valor original:
No JavaScript, as variáveis podem armazenar dois tipos de valores, a saber, o valor original e o valor de referência.
1. Valor primitivo:
Os valores originais são fixos e valores simples, que são segmentos de dados simples armazenados na pilha, ou seja, seus valores são armazenados diretamente no local em que a variável é acessada.
Existem cinco tipos de tipos primitivos: indefinido, nulo, booleano, número, string.
2. Valor de referência:
O valor de referência é um objeto relativamente grande, o objeto armazenado na pilha de heap, ou seja, o valor armazenado na variável é um ponteiro apontando para a memória onde o objeto é armazenado. Todos os tipos de referência são integrados do objeto.
Problemas de desempenho da cadeia de protótipo
Se os atributos encontrados estiverem localizados na parte superior da cadeia de protótipos, o processo de pesquisa, sem dúvida, terá um impacto negativo no desempenho. Isso será uma consideração importante quando em cenários, onde os requisitos de desempenho forem necessários. Além disso, tentar encontrar uma propriedade que não existe atravessará toda a cadeia de protótipo.
Da mesma forma, ao atravessar as propriedades de um objeto, todas as propriedades na cadeia de protótipo serão acessadas.
Resumir
A compreensão da herança do protótipo é o pré -requisito para escrever um código JavaScript mais complexo e você também deve prestar atenção à altura da cadeia de protótipo no código. Ao enfrentar gargalos de desempenho, você deve aprender a dividir a cadeia de protótipo. Além disso, para distinguir o protótipo de protótipo do protótipo do protótipo __proto__, discutiremos principalmente o protótipo de protótipo de objeto aqui e não explicaremos o problema sobre o protótipo __proto__.