Maison > interface Web > js tutoriel > le corps du texte

Compréhension approfondie de cela, prototype et fermeture en js

王林
Libérer: 2019-08-21 15:34:54
avant
2222 Les gens l'ont consulté

1. ce mot-clé

a. Il y a un objet pointant vers l'objet

b. (fenêtre);

c. New pointe vers le nouvel objet créé par new

d bind, call&apply change le point de ceci; cela pointe vers la fenêtre

f. Fonction de flèche ceci est déterminé lorsque la fonction est définie

var adder = {
  base : 1,
    
  add : function(a) {
    var f = v => v + this.base;
    return f(a);
  },

  addThruCall: function inFun(a) {
    var f = v => v + this.base;
    var b = {
      base : 2
    };
            
    return f.call(b, a);
  }
};
Copier après la connexion
var obj = {
  i: 10,
  b: () => console.log(this.i, this),
  c: function() {
    console.log( this.i, this)
  }
}
obj.b();  // undefined window{...}原型
obj.c();  // 10 Object {...}
Copier après la connexion

2. :

prototype: each Un objet va initialiser un attribut à l'intérieur de lui : prototype;

chaîne de prototypes : quand on accède aux attributs d'un objet, si cet attribut n'existe pas à l'intérieur de l'objet, alors retournez sur

pour trouver cet attribut, si vous continuez à le chercher, vous trouverez : chaîne de prototypes

Le principe est de déterminer si le __proto__ de l'objet instance et le prototype de le constructeur qui a généré l'instance fait référence à la même adresse.

__proto__

est la seule fonction en JavaScript qui gère les propriétés sans rechercher la chaîne de prototypes.

instanceof

hasOwnPropertyConstructeur ->prototype-> Objet prototype-> Constructeur

Constructeur-> 🎜>Compréhension approfondie de cela, prototype et fermeture en jsObjet d'instance-> __proto__-> Objet prototype-> __proto__->Objet prototype->->null

Contexte d'exécution

 :

déclaration de variable et déclaration de fonction, leur portée sera élevée en haut du corps de la méthode ; Portée : a. JavaScript n'a pas de portée au niveau du bloc

b. En plus de la portée globale, JavaScript n'a que des portées que les fonctions peuvent créer. La portée est déterminée lorsque la fonction est définie. plutôt que lorsque la fonction est appelée.

Clôture :

Concept : les fonctions internes peuvent accéder aux variables des fonctions externes ;

Utilisation : fonction comme valeur de retour ;

Fonction : encapsuler les variables, faire converger les autorisations ;

Inconvénient : consomme de la mémoire

Méthode de création d'objets

 :

Objet littéral ;

Constructeur ; Exécuter la fonction immédiatement ;

Object.create();

nouvelle procédure d'objet

 :

Créer un nouvel objet

cela pointe vers ce nouvel objet ; exécute le code ;

renvoie ceci

Classes et héritage

 :

Déclaration de classe

:

function Animal(){
    this.name = 'name';
}
 
// es6 
 
class Animal2{
    constructor(){
        this.name = 'name2';
    }
}
Copier après la connexion

Héritage

:1. Implémenter l'héritage à l'aide du constructeur

function Parent(){
    this.name = 'parent';
}
 
function Child(){
    Parent.call(this);
    this.type = 'child1';
}
Copier après la connexion

Inconvénients : Héritage partiel ;

ne peut pas hériter des méthodes sur l'objet prototype de la classe parent (Seuls les attributs de la classe parent sont montés sur la classe enfant, et le prototype de l'enfant n'a pas changé en Child.prototype Ne peut pas hériter du prototype du parent)

2. Héritage de la chaîne de prototypes

.
function Parent(){
    this.name = 'name';
}
function Child(){
    this.type = 'child';
}
 
Child.prototype = new Parent();
Copier après la connexion

缺点:原型链上原型对象是共用的。(原型的属性修改,所有继承自该原型的类的属性都会一起改变)

3.组合方式

function Parent(){
    this.name = 'parent';
}
function Child(){
    Parent.call(this);
    this.type = 'child';
}
Child.prototype = new Parent();
Copier après la connexion

缺点:

父类执行函数执行两次;

constructor指向父类;

function Parent(){
    this.name = 'parent';
}
function Child(){
    Parent.call(this);
    this.type = 'child';
}
Child.prototype = Parent.prototype;
Copier après la connexion

缺点:

子类constructor指向父类

function Parent(){
    this.name = 'parent';
}
function Child(){
    Parent.call(this);
    this.type = 'child';
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
Copier après la connexion

优点:

子类的原型指向Object.create(Parent.prototype),实现了子类和父类构造函数的分离,但是这时子类中还是没有自己的构造函数,

所以紧接着又设置了子类的构造函数,由此实现了完美的组合继承。(也就是把父类的prototype写入子类的prototype,在定义子类的constructor)

4. es6

class Child extends Parent {
    constructor(){
 
    }
}
Copier après la connexion

希望本文中的内容能够帮到学习JavaScript的同学。谢谢!

更多JavaScript的相关问题请访问PHP中文网:https://www.php.cn/

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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!