Sobre la herencia de las clases js

Herencia de cadena de prototipos

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

Introducción: Aquí podemos ver que un nuevo objeto vacío apunta a Animal y Cat.prototype apunta a este objeto vacío, esta es la herencia basada en la cadena de prototipos.

Características: basado en la cadena de prototipos, es tanto una instancia de la clase principal como una instancia de la subclase.

Desventajas: no se puede implementar la herencia múltiple


Herencia de construcción:

Use el método de llamada o aplicación para vincular el constructor de la clase principal a la subclase para mejorar la instancia de la subclase, lo que equivale a copiar las propiedades de la instancia de la clase principal a la subclase (no se usa el prototipo)

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: puede lograr herencia múltiple

Desventajas: solo se pueden heredar las propiedades y los métodos de la instancia de la clase principal, y las propiedades y los métodos del prototipo no se pueden heredar.


Herencia de instancia y herencia de copia

Herencia de instancias: agregue nuevas funciones a la instancia de la clase principal y devuélvala como una instancia de subclase

Copiar herencia: copiar las propiedades y métodos en el elemento principal

La viabilidad de los dos anteriores no es fuerte, por lo que no daré un ejemplo aquí.


Herencia de composición:

Es equivalente a la combinación de herencia de construcción y herencia de cadena de prototipo. Al llamar a la construcción de la clase principal, herede las propiedades de la clase principal y conserve las ventajas de pasar parámetros, y luego realice la reutilización de funciones utilizando la instancia de la clase principal como prototipo de subclase.

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

Características: puede heredar propiedades/métodos de instancia y propiedades/métodos de prototipo

Desventaja: el constructor de la clase principal se llama dos veces y se generan dos instancias

Herencia de la composición parasitaria:

A través del método parásito, el atributo de instancia de la clase principal se corta, de modo que cuando se llama dos veces a la construcción de la clase principal, el método/atributo de instancia no se inicializará dos veces.

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

más recomendado

Supongo que te gusta

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