A herança em js pode ser dividida em dois tipos: personificação de objeto e encadeamento de protótipo.
1. A representação de objeto inclui três tipos : método de atributo temporário, método call() e método apply()
1. Método de atributo temporário
Copie o código do código da seguinte forma:
função Pessoa(nome){
este.nome = nome;
isto.dizer=função(){
alert('Meu nome é '+este.nome);
}
}
função F2E(nome,id){
this.temp = Pessoa;
this.temp(nome);
exclua este.temp;
isto.id = id;
this.showId=função(){
alert('Bom dia, senhor, meu número comercial é '+this.id);
}
}
var simon = new F2E('Simon',9527);
simon.say();
simon.showId();
Método 2.call()/apply()
Essencialmente, ele altera o ponteiro deste ponteiro.
Copie o código do código da seguinte forma:
função Pessoa(nome){
este.nome = nome;
isto.dizer=função(){
alert('Meu nome é '+este.nome);
}
}
função F2E(nome,id){
Person.call(this,name); //método apply() alterado para Person.apply(this,new Array(name));
isto.id = id;
this.showId=função(){
alert('Bom dia, senhor, meu número comercial é '+this.id);
}
}
var simon = new F2E('Simon',9527);
simon.say();
simon.showId();
Desvantagens: Vejamos primeiro este diagrama de alocação de memória:
No conceito OO, após new ser instanciado, o objeto forma seu próprio espaço na memória heap. Vale ressaltar que este segmento de código. Os métodos membros existem neste segmento de código e são compartilhados. O problema está aqui. Ao herdar por personificação de objeto, todos os métodos membros apontam para isso. Ou seja, após novo, cada instância terá esse método membro, que não é compartilhado, o que resulta em um grande desperdício de memória. E por meio da representação de objeto, variáveis e métodos definidos por meio de protótipo não podem ser herdados. Por exemplo, o código a seguir causará um erro:
Copie o código do código da seguinte forma:
função Pessoa(nome){
este.nome = nome;
isto.dizer=função(){
alert('Meu nome é '+este.nome);
}
}
Pessoa.protótipo.idade = 20;
Person.prototype.sayAge = function(){alert('Minha idade é '+this.age)};
função F2E(nome,id){
Person.apply(this,new Array(nome));
isto.id = id;
this.showId=função(){
alert('Bom dia, senhor, meu número comercial é '+this.id);
}
}
var simon = new F2E('Simon',9527);
simon.sayAge(); //Prompt TypeError: simon.sayAge não é uma função
2. Método de cadeia de protótipo
Copie o código do código da seguinte forma:
função Pessoa(){
this.name = 'Simão';
}
Pessoa.prototype.say=função(){
alert('Meu nome é '+este.nome);
}
função F2E(id){
isto.id = id;
this.showId=função(){
alert('Bom dia, senhor, meu número comercial é '+this.id);
}
}
F2E.prototype = new Pessoa();
var simon = novo F2E(9527);
simon.say();
simon.showId();
alert(simon.hasOwnProperty('id')); //Verifica se é propriedade própria
A seguir, siga o exemplo acima para entender os seguintes conceitos da cadeia de protótipos js:
A cadeia de protótipos pode ser entendida como: cada objeto em js possui um atributo __proto__ oculto. O atributo __proto__ de um objeto instanciado aponta para o método protótipo de sua classe, e esse método protótipo pode ser atribuído a outro objeto de instanciação, o __proto__ de. esse objeto precisa apontar para sua classe, formando assim uma cadeia, que é a
Copie o código do código da seguinte forma:
F2E.prototype = nova Pessoa()
Esta frase é a chave. Quando um objeto js lê um determinado atributo, ele primeiro pesquisará seus próprios atributos. Se não houver atributos, ele procurará os atributos do objeto na cadeia de protótipos. Em outras palavras, os métodos da cadeia de protótipos podem ser compartilhados, o que resolve o problema de representação de objetos e desperdício de memória.
Agora vamos falar sobre as desvantagens:
A desvantagem é óbvia. A herança da cadeia de protótipo significa que os parâmetros não podem ser passados para a classe pai ao instanciar uma subclasse. É por isso que a função Person() neste exemplo não tem parâmetros e é escrita diretamente como this.name="Simon". O código a seguir não alcançará o efeito desejado:
Copie o código do código da seguinte forma:
função Pessoa(nome){
este.nome = nome;
}
Pessoa.prototype.say=função(){
alert('Meu nome é '+este.nome);
}
função F2E(nome,id){
isto.id = id;
this.showId=função(){
alert('Bom dia, senhor, meu número comercial é '+this.id);
}
}
F2E.prototype = new Pessoa();
var simão = new F2E("Simão",9527);
simon.say();
simon.showId();
função Pessoa(nome){
este.nome = nome;
}
Pessoa.prototype.say=função(){
alert('Meu nome é '+este.nome);
}
função F2E(nome,id){
isto.id = id;
this.showId=função(){
alert('Bom dia, senhor, meu número comercial é '+this.id);
}
}
F2E.prototype = new Person(); //O valor não pode ser passado aqui, nem this.name nem name funcionarão. É possível escrever diretamente F2E.prototype = new Person('wood'), mas neste caso simon. say( ) se torna Meu nome é madeira
var simão = new F2E("Simão",9527);
simon.say(); //Aparecer Meu nome é indefinido
simon.showId();
Finalmente, deixe-me resumir o que considero a melhor maneira de implementar a herança. As variáveis de membro usam representação de objeto e os métodos de membro usam encadeamento de protótipo.
Copie o código do código da seguinte forma:
função Pessoa(nome){
este.nome = nome;
}
Pessoa.prototype.say=função(){
alert('Meu nome é '+este.nome);
}
função F2E(nome,id){
Pessoa.call(isto,nome);
isto.id = id;
}
F2E.prototype = new Pessoa();
//Observe um detalhe aqui, showId não pode ser escrito na frente de F2E.prototype = new Person();
F2E.prototype.showId = função(){
alert('Bom dia, senhor, meu número comercial é '+this.id);
}
var simon = new F2E("Simon",9527);
simon.say();
simon.showId();