Como uma linguagem orientada a objetos (JS é baseada em objetos), é essencial implementar a herança, mas como não há conceito de classe em si, ele não implementará a herança por meio de classes como uma linguagem de programação orientada a objetos, mas pode implementar a herança através de outros métodos. Existem muitas maneiras de implementar a herança, e a seguir são apenas algumas delas.
1. Herança da cadeia de protótipo
function pessoa () {// A função herdada é chamada de supertipo (classe pai, classe base) this.name = 'mumu'; this.age = '18 '; } Pessoa.prototype.name = 'Susu'; // Quando o nome do atributo é o mesmo, você precisa estar mais próximo, pesquise primeiro na instância, mas depois vá para o protótipo para encontrar o funcionário da função () {// A função herdada é chamada de subtipo (subclasse, classe derivada) this.job = 'student'; } Trabalhador.prototype = new Person (); // herdado através da cadeia de protótipo, a instância do objeto instanciada pelo supertipo é atribuída ao atributo de protótipo da subclasse var P2 = new Worker (); console.log (p2.name); console.log (P2 instância do objeto); // TURE Todos os construtores são herdados do objetoA chave para a implementação da herança acima é: trabalhador.prototype = new Person (); Faça do protótipo do trabalhador uma instância de pessoa e herdá -la através da cadeia de protótipo.
Nota: Ao usar as cadeias de protótipo para implementar a herança, você não pode usar os literais de objetos para criar métodos de protótipo, porque isso interromperá o relacionamento e reescreverá a cadeia de protótipo.
Problema de herança da cadeia de protótipo:
1. Existe um problema de compartilhamento de referência e eles ainda compartilham o mesmo espaço, e a subclasse afetará a classe pai.
function pessoa () {this.bodys = ['olho', 'pés']; } função trabalhador () {} trabalhador.prototype = new Person (); var p1 = new Worker (); p1.bodys.push ('mão'); var p2 = new Worker (); console.log (p1.bodys); console.log (p2.bodys);2. Ao criar instâncias de subtipos, os parâmetros não podem ser passados em construtores de supertipo.
Então, como resolver os dois problemas da cadeia de protótipos? Em seguida, continue olhando para o método de herança abaixo ~
2. Heritância do construtor de empréstimos (também chamado de representação de objeto, objeto forjado ou herança clássica)
função pessoa (nome, idade) {this.name = name; this.age = idade; this.bodys = ['Eye', 'Foot']; } Pessoa.prototype.showname = function () {console.log (this.name); } funcionário da função (nome, idade, trabalho) {Person.call (este, nome, idade); this.Job = Job; // Subclasse Add Atributes} var P1 = new Worker ('Mumu', '18', 'Student'); p1.bodys.push ('mão'); var p2 = new Worker (); console.log (p1.name); console.log (p2.bodys); console.log (p1.showname ());Uma breve análise do princípio acima do uso de construtores emprestados: Person.call (este, nome, idade); Esse código chama o construtor pai, herda o atributo pai e usa o método de chamada para chamar o construtor da pessoa para alterar isso quando a função for executada. Aqui, este-> novo é um método disfarçado de construtor de objeto de obra de trabalhador: Passe o trabalhador para a pessoa acima.
Quando o tipo de referência é colocado no construtor, ele não será compartilhado; portanto, P2 não é afetado.
Emprestando o método de herança do construtor aqui resolve o problema de que a cadeia de protótipo não pode passar parâmetros e compartilhar tipos de referência.
Dicas: Call () e Aplicar () Os métodos podem alterar o escopo da execução da função, em resumo, alterar o conteúdo apontado por essa função.
Call () e Aplicar () aceitar dois parâmetros: o primeiro é o escopo da função em execução, e o outro é o parâmetro aprovado.
A diferença entre chamada e aplicação é a diferença nos parâmetros.
Os parâmetros na chamada devem ser enumerados um por um.
Os parâmetros em aplicação devem ser matrizes ou objetos de argumentos
Portanto, a pergunta é: por que o resultado de P1.ShowName () está errado? ---- porque o método de herança de emprestar construtores pode herdar apenas atributos e métodos no construtor. Aqui também encontramos um problema de construtores de empréstimos.
NOTA: Como colocamos todos os métodos no construtor, toda vez que instanciamos, alocamos o espaço de memória para desperdiçar recursos, por isso geralmente colocamos métodos no protótipo e atributos no construtor.
Problema de herança do construtor de empréstimos:
Como o empréstimo de um construtor pode herdar apenas as propriedades e métodos no construtor, os métodos definidos no protótipo do supertipo são invisíveis para a subclasse, por isso é equivalente a não ter protótipo. Como resultado, todos os métodos só podem ser definidos no construtor; portanto, não há multiplexação de função.
Então, como resolver o problema causado por construtores de empréstimos? Então depende do seguinte método de herança
3. Herança combinada (herança pseudo-clássica)
função pessoa (nome, idade) {this.name = name; this.age = idade; } Pessoa.prototype.showname = function () {console.log (this.name); } funcionário da função (nome, idade, trabalho) {Person.call (este, nome, idade); // Construtor de emprestado this.job = job; } Trabalhador.prototype = new Person (); // herança da cadeia de protótipo var p1 = novo trabalhador ('mumu', '18', 'estudante'); console.log (p1.age); p1.showName ();Herança combinada: combinando a cadeia de protótipos com o construtor emprestado.
Ideia: usando a cadeia de protótipo para implementar a herança de atributos e métodos no protótipo e emprestando o construtor para implementar a herança dos atributos de instância
O exemplo acima Pessoa.call (este, nome, idade); emprestar o construtor para herdar atributos
Trabalhador.prototype = new Person (); a cadeia de protótipo herda o método, evita as deficiências dos dois, combina suas vantagens e se torna o modelo de herança mais comumente usado.
Questões de herança combinada:
O construtor de supertipo é chamado duas vezes, uma vez ao criar um protótipo de subtipo e o outro tempo dentro do construtor de subtipo.
Para resolver esse problema, devemos usar a herança de combinação parasita.
4. Herança de protótipo
função objeto (proto) {função f () {} f.prototype = proto; retornar novo f (); } var pessoa = {nome: 'mumu', amigos: ['xiaxia', 'susu']}; var de outro, objeto (pessoa); outro lugar.friends.push ('wen'); var yetanotherperson = objeto (pessoa); outro lugar.friends.push ('tian'); console.log (Pessoa.friends); // ["xiaxia", "Susu", "Wen", "Tian"] Console.log (OUTHERPERSON .__ Proto __) // Objeto {Nome: "Mumu", Amigos: Array [4]}Uma breve análise: o objeto de função (proto) é uma função de relé temporária, o parâmetro proto nele representa um objeto a ser transmitido. O construtor f () é um objeto recém -criado temporário, usado para armazenar o objeto aprovado. F.prototype = proto; Atribua a instância do objeto ao objeto protótipo do construtor F e, finalmente, retorne a instância do objeto do objeto passado. Herança de protótipo ou atributos de compartilhamento dos tipos de referência.
5. Herança parasitária
// Objeto de função de trânsito temporário (proto) {função f () {} f.prototype = proto; retornar novo f (); } // Função de parasita Crie (proto) {var f = objeto (proto); f.love = function () {return this.name; } retornar f; } var pessoa = {nome: 'mumu', amigos: ['xiaxia', 'susu']}; var de outro = Criar (pessoa); console.log (outroPerson.love ()); Herança de combinação parasita6. Herança de combinação parasitária
função objeto (proto) {função f () {} f.prototype = proto; retornar novo f (); } // Função do parasita Crie (pessoa, trabalhador) {var f = object (Person.prototype); // Crie objeto F.Constructor = trabalhador; // Ajuste o ponteiro de construção do protótipo e aprimore o objeto trabalhador.prototype = f; // Especifique a pessoa do objeto} (nome, idade) {this.Name = Name; this.age = idade; } Pessoa.prototype.showname = function () {console.log (this.name); } funcionário da função (nome, idade, trabalho) {Person.call (este, nome, idade); this.Job = Job; } create (pessoa, trabalhador); // herança de parasita herança var p1 = nova pessoa ('mumu', '18', 'aluno'); p1.showName ();Este método também é a maneira mais perfeita e ideal de implementar métodos de herança agora.
As notas de aprendizado de herança JavaScript acima [devem ler para iniciantes] é todo o conteúdo compartilhado pelo editor. Espero que possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.