Mot-clé JavaScript pour débutants

L'auteur du document, dont nous publions la traduction aujourd'hui, dit que lorsqu'elle travaillait en comptabilité, des termes clairs y étaient employés, dont la signification est facile à trouver dans le dictionnaire. Mais après avoir commencé la programmation, et en particulier JavaScript, elle a commencé à trouver de tels concepts dont les définitions ne peuvent plus être trouvées dans les dictionnaires. Par exemple, cela concerne le mot this clé this . Elle se souvient de l'époque où elle a rencontré des objets JS et des fonctions constructeurs qui utilisaient ce mot-clé, mais il n'a pas été si facile d'obtenir sa signification exacte. Elle pense que d'autres débutants sont confrontés à des problèmes similaires, en particulier ceux qui n'ont jamais travaillé en programmation auparavant. Ceux qui veulent apprendre JavaScript devront de toute façon s'en occuper. Ce matériel vise à aider tout le monde à aider avec cela.



Qu'est-ce que c'est?


J'attire votre attention sur ma propre définition du this . This s'agit d'un mot clé utilisé en JavaScript qui a une signification particulière, selon le contexte dans lequel il est utilisé.

La raison pour laquelle this crée tant de confusion pour les débutants est que le contexte de this change en fonction de son utilisation.

This peut être considéré comme un mot clé dynamique. J'aime la façon dont le concept de «contexte» est révélé dans cet article de Ryan Morr. Selon lui, le contexte est toujours la valeur du this , qui fait référence à un objet qui "possède" le code en cours d'exécution. Cependant, le contexte qui s'y rapporte n'est pas le même que le contexte d'exécution.

Ainsi, lorsque nous utilisons le mot this clé this , nous nous référons en fait à un objet avec son aide. Parlons de ce qu'est cet objet, après avoir examiné quelques exemples.

Situations lorsque cela pointe vers un objet fenêtre


Si vous essayez d'accéder au this dans la portée globale, il sera lié au contexte global, c'est-à-dire à l'objet window dans le navigateur.

Lorsque vous utilisez des fonctions disponibles dans le contexte global (cela les distingue des méthodes d'objet), le this pointera vers l'objet window .

Essayez d'exécuter ce code, par exemple, dans la console du navigateur:

 console.log(this); //     Window // Window { postMessage: ƒ, // blur: ƒ, // focus: ƒ, // close: ƒ, // frames: Window, …} function myFunction() { console.log(this); } //   myFunction(); //      Window! // Window { postMessage: ƒ, // blur: ƒ, // focus: ƒ, // close: ƒ, // frames: Window, …} 

Utiliser cela à l'intérieur d'un objet


Lorsqu'il this utilisé à l'intérieur d'un objet, ce mot clé fait référence à l'objet lui-même. Prenons un exemple. Supposons que vous ayez créé un objet dog avec des méthodes et que vous l'ayez appelé dans l'une de ses méthodes. Lorsqu'il this utilisé dans cette méthode, ce mot-clé représente l'objet dog .

 var dog = { name: 'Chester', breed: 'beagle', intro: function(){   console.log(this); } }; dog.intro(); //      dog       // {name: "Chester", breed: "beagle", intro: ƒ} //    breed:"beagle" //    intro:ƒ () //    name:"Chester" //    __proto__:Object 

Cet objet et les objets imbriqués


L'application de this dans des objets imbriqués peut créer une certaine confusion. Dans de telles situations, il convient de se rappeler que le mot-clé this fait référence à l'objet dans la méthode duquel il est utilisé. Prenons un exemple.

 var obj1 = { hello: function() {   console.log('Hello world');   return this; }, obj2: {     breed: 'dog',     speak: function(){           console.log('woof!');           return this;       }   } }; console.log(obj1); console.log(obj1.hello());  //  'Hello world'   obj1 console.log(obj1.obj2); console.log(obj1.obj2.speak());  //  'woof!'   obj2 

Caractéristiques des fonctions fléchées


Les fonctions fléchées se comportent différemment des fonctions normales. N'oubliez pas: lorsque vous y accédez dans la méthode d'un objet, ce mot-clé correspond à l'objet auquel appartient la méthode. Cependant, cela ne s'applique pas aux fonctions fléchées. Au lieu de cela, this dans de telles fonctions se réfère au contexte global (l'objet window ). Considérez le code suivant qui peut être exécuté dans la console du navigateur.

 var objReg = { hello: function() {   return this; } }; var objArrow = {   hello: () => this }; objReg.hello(); // ,   ,  objReg objArrow.hello(); //   Window! 

Si, dérouté par le problème, regardez MDN , vous pouvez trouver des informations selon lesquelles les fonctions fléchées ont une forme d'écriture plus courte que les expressions fonctionnelles et ne sont pas liées à leurs propres entités this , arguments , super ou new.target . Les fonctions fléchées sont mieux adaptées pour une utilisation en tant que fonctions ordinaires, plutôt que comme méthodes objet; elles ne peuvent pas être utilisées comme constructeurs.

Nous écouterons MDN et n'utiliserons pas les fonctions fléchées comme méthodes d'objet.

Utilisation de ceci dans des fonctions régulières


Lorsqu'une fonction régulière est de portée globale, le mot-clé this utilisé dans celle-ci sera lié à l'objet window . Voici un exemple dans lequel la fonction de test peut être considérée comme une méthode de l'objet window .

 function test() { console.log('hello world'); console.log(this); } test(); // hello world // Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …} 

Cependant, si la fonction est exécutée en mode strict, alors undefined sera écrit dans ceci , car dans ce mode les liaisons par défaut sont désactivées. Essayez d'exécuter l'exemple suivant dans la console du navigateur.

 function test() { 'use strict'; return this; } console.log( test() ); //  undefined,    Window 

L'appeler à partir d'une fonction qui a été déclarée en dehors de l'objet, puis affectée comme méthode


Prenons l'exemple de l'objet dog que nous connaissons déjà. En tant que méthode de cet objet, vous pouvez affecter la fonction de chase déclarée en dehors de celui-ci. Il n'y avait aucune méthode dans l'objet dog , jusqu'à ce que nous ayons créé la méthode foo , à laquelle la fonction de chase été affectée. Si vous appelez maintenant la méthode dog.foo , la fonction de chase sera appelée. Le mot this clé this , qui est accessible dans cette fonction, pointe vers l'objet dog . Et la fonction de chase , en essayant de l'appeler en tant que fonction indépendante, se comportera de manière incorrecte, car avec cette approche, this pointera vers un objet global qui n'a pas les propriétés auxquelles nous, dans cette fonction, accédons par this biais.

 var dog = { breed: 'Beagles', lovesToChase: 'rabbits' }; function chase() { console.log(this.breed + ' loves chasing ' + this.lovesToChase + '.'); } dog.foo = chase; dog.foo(); //    Beagles loves chasing rabbits. chase(); //      

Nouveau mot-clé et ce


Le mot this clé this est utilisé dans les fonctions constructeurs utilisées pour créer des objets, car il permet, de manière universelle, de travailler avec de nombreux objets créés à l'aide d'une telle fonction. JavaScript possède également des fonctions constructeurs standard avec lesquelles, par exemple, vous pouvez créer des objets de type Number ou String . Des fonctions similaires, déterminées par le programmeur seul, lui permettent de créer des objets dont la composition des propriétés et des méthodes est définie par eux-mêmes.

Comme vous l'avez déjà compris, j'aime les chiens, nous allons donc décrire une fonction constructeur pour créer des objets comme Dog qui contiennent des propriétés et des méthodes.

 function Dog(breed, name, friends){   this.breed = breed;   this.name = name;   this.friends = friends;   this.intro = function() {       console.log(`Hi, my name is ${this.name} and I'm a ${this.breed}`);       return this;   }; } 

Lorsqu'une fonction constructeur est appelée à l'aide du new mot-clé, this ci pointe vers un nouvel objet qui, à l'aide du constructeur, est fourni avec des propriétés et des méthodes.

Voici comment travailler avec des constructeurs JavaScript standard.

 var str = new String('Hello world'); /*******    ,     ,  ,     str2 .        ,   JavaScript   ,   ,    ,      .        .  ,  ,  ,   ,           . *******/ var str2 = 'Hello world'; //    , ,  ,        

Maintenant, travaillons avec la fonction constructeur Dog nouvellement créée.

 //      Dog var chester = new Dog('beagle', 'Chester', ['Gracie', 'Josey', 'Barkley']); chester.intro();        //  Hi, my name is Chester and I'm a beagle console.log(chester);   //  Dog {breed: "beagle", name: "Chester", friends: Array(3), intro: ƒ} 

Voici un autre exemple d'utilisation de fonctions constructeur.

 var City = function(city, state) { this.city = city || "Phoenix"; this.state = state || "AZ"; this.sentence = function() {   console.log(`I live in ${this.city}, ${this.state}.`); }; }; var phoenix = new City(); //     console.log(phoenix); //       phoenix.sentence(); //  I live in Phoenix, AZ. var spokane = new City('Spokane', 'WA'); console.log(spokane); //    spokane.sentence(); //  I live in Spokane, WA. 

À propos de l'importance du nouveau mot clé


Lors de l'appel de la fonction constructeur à l'aide du new mot clé, le this pointe vers un nouvel objet qui, après un certain travail, sera renvoyé par cette fonction. Le mot this clé this dans cette situation est très important. Pourquoi? Le fait est qu'avec son aide, il est possible, en utilisant une seule fonction constructeur, de créer de nombreux objets du même type.

Cela nous permet de faire évoluer l'application et de réduire la duplication de code. Afin de comprendre l'importance de ce mécanisme, réfléchissez à l'organisation des comptes de médias sociaux. Chaque compte peut être une instance d'un objet créé à l'aide de la fonction constructeur Friend . Chacun de ces objets peut être rempli d'informations utilisateur uniques. Considérez le code suivant.

 // - var Friend = function(name, password, interests, job){ this.fullName = name; this.password = password; this.interests = interests; this.job = job; }; function sayHello(){  //   ,  ,    this  // console.log(this); return `Hi, my name is ${this.fullName} and I'm a ${this.job}. Let's be friends!`; } //          Friend,    new var john = new Friend('John Smith', 'badpassword', ['hiking', 'biking', 'skiing'], 'teacher'); console.log(john); //    greeting  john john.greeting = sayHello; //     console.log( john.greeting() ); //   ,  sayHello()       console.log( sayHello() ) ; 

Résumé


En fait, l'utilisation du this en JavaScript n'est pas limitée aux exemples décrits ci-dessus. Ainsi, une série de ces exemples pourrait inclure l'utilisation des fonctions call , apply et bind . Étant donné que ce matériel est destiné aux débutants et vise à expliquer les bases, nous ne les abordons pas ici. Cependant, si vous avez maintenant acquis une compréhension initiale de this , vous pouvez facilement comprendre ces méthodes. L'essentiel est de se rappeler que si vous ne comprenez pas quelque chose la première fois, n'arrêtez pas d'apprendre, de pratiquer, de lire des documents sur le sujet qui vous intéresse. Dans l'un d'eux, vous rencontrerez sûrement quelque chose (une sorte de phrase réussie, par exemple) qui vous aidera à comprendre ce que vous ne pouviez pas comprendre auparavant.

Chers lecteurs! Avez-vous eu de la difficulté à comprendre ce mot-clé en JavaScript?

Source: https://habr.com/ru/post/fr419371/


All Articles