Sobre a herança de classes js

Herança da cadeia de protótipo

function Cat(){
    
    }
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.eat('fish'));
console.log(cat.sleep());
console.log(cat instanceof Animal); //true
console.log(cat instanceof Cat); //true

Introdução: Aqui podemos ver que um novo objeto vazio aponta para Animal e Cat.prototype aponta para este objeto vazio.Esta é a herança baseada na cadeia de protótipos.

Características: Com base na cadeia de protótipos, é uma instância da classe pai e uma instância da subclasse

Desvantagens: Não é possível implementar herança múltipla


Construir herança:

Use o método call ou apply para vincular o construtor da classe pai à subclasse para aprimorar a instância da subclasse, o que equivale a copiar as propriedades da instância da classe pai para a subclasse (o protótipo não é usado)

function Cat(name){
    
    
	Animal.call(this);
	this.name = name || 'Tom';
}

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true

Características: Pode alcançar herança múltipla

Desvantagens: Somente as propriedades e métodos da instância da classe pai podem ser herdados, e as propriedades e métodos do protótipo não podem ser herdados.


Herança de instância e herança de cópia

Herança de instância: adicione novos recursos à instância da classe pai e retorne-a como uma instância da subclasse

Copiar herança: copie as propriedades e métodos no elemento pai

A praticidade dos dois acima não é forte, então não darei um exemplo aqui.


Herança de composição:

É equivalente à combinação de herança de construção e herança de cadeia de protótipo. Ao chamar a construção da classe pai, herde as propriedades da classe pai e retenha as vantagens de passar parâmetros e, em seguida, realize a reutilização da função usando a instância da classe pai como o protótipo da subclasse

function Cat(name){
    
    
	Animal.call(this);
	this.name = name || 'Tom';
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // true

Recursos: você pode herdar propriedades/métodos de instância e propriedades/métodos de protótipo

Desvantagem: o construtor da classe pai é chamado duas vezes e duas instâncias são geradas

Herança da composição parasitária:

Por meio do método parasitário, o atributo de instância da classe pai é cortado, de modo que quando a construção da classe pai for chamada duas vezes, o método/atributo de instância não será inicializado duas vezes

function Cat(name){
    
    
	Animal.call(this);
	this.name = name || 'Tom';
}(function(){
    
    
	// 创建一个没有实例方法的类
	var Super = function(){
    
    };
	Super.prototype = Animal.prototype;
	//将实例作为子类的原型
	Cat.prototype = new Super();
})();

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); //true

mais recomendado

Acho que você gosta

Origin blog.csdn.net/Robergean/article/details/120163139
Recomendado
Clasificación