Maison  >  Article  >  interface Web  >  Plusieurs méthodes d'implémentation de l'héritage en JavaScript

Plusieurs méthodes d'implémentation de l'héritage en JavaScript

php中世界最好的语言
php中世界最好的语言avant
2018-05-14 14:03:562768parcourir

Cet article vous présentera plusieurs méthodes d'implémentation de l'héritage en JavaScript. J'espère qu'après avoir lu cet article, vous aurez une certaine compréhension de l'héritage en JavaScript !

Plusieurs méthodes d'implémentation de l'héritage en JavaScript

Plusieurs méthodes d'implémentation de l'héritage en JavaScript

Héritage

Voulez-vous implémenter héritage, vous devez d'abord avoir une classe parent (constructeur) pour fournir des propriétés et des méthodes.

function Father(name){
    this.name=name   //父类构造函数中的属性
}
Father.prototype.age='40'   //父类原型中的属性

1. Emprunter l'héritage du constructeur

var Son=function(){
    Father.call(this,...arguments)
    this.age=10
}
var son=new Son('小明')
console.log(son)   //{name: "小明", age: 10}

À ce stade, la fonction Son appelle simplement le constructeur parent dans le constructeur enfant via la méthode d'appel

C'est-à-dire qu'il hérite uniquement des attributs du constructeur de la classe parent et n'hérite pas des attributs du prototype de la classe parent.

Vous pouvez utiliser la méthode instanceof pour juger à ce moment

console.log(son instanceof Father) //false

2 Hériter via la chaîne de prototypes

var Son=function(name){
    this.sonName=name
}
Son.prototype=new Father()
var xiaoming=new Son('小明')
console.log(xiaoming)    //{sonName:'小明'}
console.log(xiaoming.__proto__==Son.prototype)   //true
console.log(xiaoming.__proto__.__proto__==Father.prototype) //true
console.log(xiaoming.age)  //40  通过原型链查找

Son hérite. le constructeur Père L'attribut name et l'attribut age dans le prototype,

L'objet prototype de Son Xiao Ming hérite de l'attribut sonName dans le constructeur Son, de l'attribut name dans le constructeur Father et de l'attribut age dans le prototype, mais la valeur ne peut être transmise qu'au Fils, mais pas au Père.

3. Héritage combiné (héritage combiné de chaîne de prototype et héritage de constructeur emprunté)

var Son=function(){
    Father.call(this,...arguments)
}
Son.prototype=new Father()
var son=new Son('小明')
console.log(son)  //{name:'小明'}
console.log(son.age) //40

Combiné les deux méthodes d'héritage 1 et 2 pour résoudre le problème de l'incapacité pour hériter du prototype Attributs, méthodes et problème de l'impossibilité de transmettre des paramètres. En fait, la sous-classe aura deux attributs de la classe parent, mais les attributs de la sous-classe couvrent les attributs de la classe parent (Father.call(), new Father())

4. Copier l'héritage

Par for...in, attribuer cycliquement les propriétés et méthodes énumérables de l'objet de classe parent et de l'objet prototype au prototype de Son

function Son(name){
  var father=new Father()
  for(let i in father){
    console.log(father[i])
    Son.prototype[i]=father[i]
  }
  Son.prototype.name=name
}
var son=new Son('leo')
console.log(son)

Cette méthode ne peut pas être obtenue Les méthodes non énumérables de la classe parent nécessitent également de copier les propriétés et les méthodes de la classe parent, elles occupent donc beaucoup de mémoire et sont moins efficaces.

5. Héritage prototypique

L'utilisation de l'héritage prototypique ne nécessite pas de définir une classe, de passer le paramètre obj et de générer un objet qui hérite de l'objet obj. Semblable à copier un objet et à l’envelopper avec une fonction. Mais il ne s’agit pas d’un héritage de classe, mais d’une base de prototype dépourvue du concept de classe.

function ObjectCreate(obj){ //这个方法的原理就是Object.create()
  function F(){}
  F.prototype=obj
  return new F()
}
var Son=new Father('son');
var son=ObjectCreate(Son)
var objson=Object.create(Son);
console.log(son.name)   //son
console.log(objson.name)  //son
console.log(son.__proto__==Son)  //true

6. Héritage parasite

Créez une fonction juste pour encapsuler le processus d'héritage, puis améliorez l'objet d'une manière ou d'une autre en interne, et enfin renvoyez l'objet

function ObjectCreate(obj){
  function F(){}
  F.prototype=obj
  return new F()
}
var Son=new Father();
function subObject(obj){
  var sub=ObjectCreate(obj)
  sub.name='son'
  return sub
}
var son=subObject(Son)
console.log(son.name)  //son

7. Héritage combiné parasite

Combinant l'héritage parasite et l'héritage combiné, la méthode d'héritage sans deux attributs de superclasse est parfaitement réalisée, mais c'est trop compliqué, et ça on a l'impression que ce n'est pas aussi bon qu'un héritage combiné.

function ObjectCreate(obj){
  function F(){}
  F.prototype=obj
  return new F()  
}
var middle=ObjectCreate(Father.prototype) //middle的原型继承了父类函数的原型
function Son(){
  Father.call(this,...arguments)
}
Son.prototype=middle; 
middle.construtor=Son;   //修复实例 
var son=new Son('son');
console.log(son)   //{name:'son'}

Cet article provient de la rubrique tutoriel js, bienvenue pour apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer