Maison  >  Article  >  interface Web  >  Introduction à trois méthodes de simulation JavaScript pour réaliser l'encapsulation et leurs différences

Introduction à trois méthodes de simulation JavaScript pour réaliser l'encapsulation et leurs différences

黄舟
黄舟original
2017-10-27 09:23:481469parcourir

Avant-propos

L'héritage consiste à utiliser une sous-classe pour hériter d'une autre classe parent, la sous-classe peut alors automatiquement avoir tous les attributs et méthodes, ce processus s'appelle l'héritage ! Il existe de nombreuses façons d'implémenter l'héritage dans JS. Aujourd'hui, je vais vous en présenter trois.

1. Ajoutez une méthode d'extension à la Classe Object

//声明一个父类
function Person(name){
 this.name=name;
 this.age=age;
 this.say=function(){
   alert("我叫"+this.name);
 }
}
//声明一个子类 
function Student(){
 this.no=no;
 this.study=function(){
  alert("我在学习!");
 }
}
// 通过循坏,将父类对象的所有属性和方法,全部赋给子类对象
Object.prototype.extend=function(parent){
 for(var i in parent){
   this[i].parent[i];
 }
}
var p=new Person("张三",12);
var s=new Student("1234567");
//子类对象调用这个扩展方法
s.extend()
console.log(s);

Ci-dessus Le principe de mise en œuvre de l'héritage :

Grâce au bouclage, tous les attributs et méthodes de l'objet classe parent sont attribués à l'objet classe enfant. Le point clé est la boucle for-in Même sans étendre Object, l'opération peut être implémentée via une simple boucle.

Cependant, l'utilisation de cette méthode pour implémenter l'héritage présente certains inconvénients :

① Vous ne pouvez pas obtenir directement l'objet de sous-classe complet via une seule instanciation . Vous devez d'abord obtenir l'objet de classe parent et l'objet de sous-classe, puis les fusionner manuellement

②La méthode d'héritage d'extension d'Object sera également conservée sur l'objet de la sous-classe.

Jetons un coup d'œil à la deuxième méthode d'implémentation de l'héritage~

2 Utiliser l'héritage prototypique

Parlons de cette méthode avant de la présenter Deux. concepts : objet prototype et prototype

1. prototype : objet prototype de fonction

① Seules les fonctions ont un prototype, et toutes les fonctions doivent avoir un prototype

②Le prototype lui-même est aussi un objet !

③prototype pointe vers l'adresse de référence de la fonction actuelle !

2. proto : Le prototype de l'objet !

①Seuls les objets ont un proto, et tous les objets doivent avoir un proto

②le proto est également un objet, il a donc également son propre proto. L'ordre de recherche le long de cette ligne est Prototype. chaîne.

③ Les fonctions et les tableaux sont des objets et ont leur propre proto

//声明父类
function Person(name,age){
   this.name=name;
   this.age=age;
   this.say=function(){
    alert("我叫"+this.name);
   }
}
//声明子类   
function Student(no){
   this.no=no;
   this.study=function(){
    alert("我在学习!我叫"+this.name+"今年"+this.age");
   }
}
//将父类对象赋给子类的prototype  
Student.prototype=new Person("张三",14);
//拿到子类对象时,就会将父类对象的所有属性和方法,添加到proto
var s=new Student(); 
s.study();

Le principe d'utilisation de l'héritage prototypique :

Attribuez l'objet de classe parent au prototype de la sous-classe, puis les attributs et méthodes de l'objet de classe parent apparaîtront dans le prototype de la sous-classe. Ensuite, lors de l'instanciation d'une sous-classe, le prototype de la sous-classe sera dans le proto de l'objet sous-classe. Enfin, les attributs et méthodes de l'objet classe parent apparaîtront dans le proto de l'objet sous-classe.

Caractéristiques de ce type d'héritage :

①Tous les attributs de la sous-classe elle-même sont des attributs membres, et les attributs hérités de la classe parent sont des propriétés de prototype.

② Impossible d'obtenir l'objet de sous-classe terminé via une instanciation en une étape.

La troisième façon d'implémenter l'héritage :

call(), apply() et bind(), ces trois méthodes sont très similaires, seulement différent dans les paramètres de passage.

function Person(name,age){
  this.name=name;
  this.age=age;
  this.say=function(){
    alert("我叫"+this.name);
    }
}
function Student(no,name,age){
  this.no=no;
  this.study=function(){
    alert("我在学习!");
  }
//将父类函数的this,指向为子类函数的this
Person.call(this,name,age);
}
var s=new Student(12,"张三",24);
console.log(s);

La seule différence entre les trois fonctions est la façon dont elles acceptent la liste des paramètres de func. A part ça, il n'y a aucune différence de fonctionnalité !

Comment écrire les trois fonctions (différence) :

Comment écrire call : func.call (obj pointé par ceci de func , paramètre func 1, paramètre func 2,...);

appliquer la méthode d'écriture : func.apply(obj pointé par ceci de func, [paramètre func 1, paramètre func 2,...]) ;

Méthode d'écriture de liaison : func.bind (obj pointé par ceci de func) (paramètre func 1, paramètre func 2,...);

Résumé

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn