Padrão de herança de combinação de JavaScript

5

No capítulo de JavaScript profissional para desenvolvedores da Web na OOP, Nicholas Zachas descreve um padrão de herança de JavaScript que ele refere-se a como herança combinada . A ideia básica é que os métodos são herdados via encadeamento de protótipos; enquanto propriedades pai são passadas para descendentes chamando o construtor pai dentro do construtor filho.

Um pequeno exemplo:

function Parent() {
    this.parentProperty;
}

Parent.prototype.parentMethod = function() {
    console.info(parentProperty);
}

function Child() {
    Parent();
}

Child.prototype = new Parent();

Ele conclui sua discussão dizendo que "herança de combinação é o padrão de herança mais usado em JavaScript."

No entanto, em sua discussão seguinte sobre o padrão de herança prototypal, ele menciona uma deficiência da herança de combinação, ou seja, que o tipo filho invoca o construtor pai duas vezes: uma vez ao criar o protótipo e depois novamente no construtor.

Minha pergunta é por que o padrão de herança de combinação sugere estender o protótipo fazendo o protótipo da criança ser uma instância do tipo pai, por que não deveria referenciar diretamente o protótipo do pai? Usando o exemplo anterior, por que não fazer o seguinte:

Child.prototype = Parent.prototype;
    
por Isaac Kleinman 28.07.2014 / 04:42
fonte

1 resposta

1

Ao fazer:

Child.prototype = Parent.prototype;

Você está essencialmente criando uma referência ao protótipo de Parent , o que significa que qualquer propriedade adicionada ao protótipo de Child agora é adicionada ao protótipo de Parent .

Por outro lado, fazendo:

Child.prototype = new Parent();
O protótipo de

Child herda todas as propriedades de Parent via encadeamento de protótipo, portanto, adicionar uma propriedade ao protótipo de Child não afeta o protótipo de Parent .

Child.prototype = Object.create(Parent.prototype);

O texto acima é o mesmo, exceto que ele não executa a função construtor do Parent ao criar Child ' s protótipo.

    
por 07.09.2015 / 02:11
fonte