JavaScript palabra clave esto para principiantes

La autora del material, cuya traducci贸n publicamos hoy, dice que cuando trabajaba en contabilidad, all铆 se usaban t茅rminos claros, cuyos significados son f谩ciles de encontrar en el diccionario. Pero despu茅s de comenzar a programar y, en particular, JavaScript, comenz贸 a encontrar conceptos cuyas definiciones ya no se pueden encontrar en los diccionarios. Por ejemplo, esto se refiere a la palabra clave this . Ella recuerda el momento en que se encontr贸 con objetos JS y funciones de constructor que usaban esta palabra clave, pero no fue tan f谩cil llegar a su significado exacto. Ella cree que otros principiantes enfrentan problemas similares, especialmente aquellos que no han trabajado en programaci贸n antes. Aquellos que quieran aprender JavaScript tendr谩n que lidiar con this todos modos. Este material est谩 destinado a ayudar a todos a ayudar con esto.



Que es esto


Les traigo a mi atenci贸n mi propia definici贸n de this . This es una palabra clave utilizada en JavaScript que tiene un significado especial, dependiendo del contexto en el que se utiliza.

La raz贸n por la que this causa tanta confusi贸n para los novatos es porque el contexto de this cambia dependiendo de su uso.

This puede considerarse una palabra clave din谩mica. Me gusta c贸mo se revela el concepto de "contexto" en este art铆culo de Ryan Morr. Seg煤n 茅l, el contexto es siempre el valor de this , que se refiere a un objeto que "posee" el c贸digo que se est谩 ejecutando actualmente. Sin embargo, el contexto relacionado con this no es el mismo que el contexto de ejecuci贸n.

Entonces, cuando usamos la palabra clave this , de hecho, nos referimos a alg煤n objeto con su ayuda. Hablemos de qu茅 es este objeto, despu茅s de examinar algunos ejemplos.

Situaciones cuando esto apunta a un objeto de ventana


Si intenta acceder a this en el 谩mbito global, estar谩 vinculada al contexto global, es decir, al objeto de window en el navegador.

Cuando se utilizan funciones que est谩n disponibles en el contexto global (esto las distingue de los m茅todos de objeto), la this en ellas apuntar谩 al objeto de window .

Intente ejecutar este c贸digo, por ejemplo, en la consola del navegador:

 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, 鈥 

Usando esto dentro de un objeto


Cuando this usa dentro de un objeto, esta palabra clave se refiere al objeto mismo. Considera un ejemplo. Suponga que cre贸 un objeto dog con m茅todos y lo llam贸 en uno de sus m茅todos. Cuando this usa dentro de este m茅todo, esta palabra clave representa el objeto 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 

Esto y objetos anidados


Aplicar this en objetos anidados puede crear cierta confusi贸n. En tales situaciones, vale la pena recordar que esta palabra clave se refiere al objeto en cuyo m茅todo se utiliza. Considera un ejemplo.

 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 

Funciones de flecha caracter铆sticas


Las funciones de flecha se comportan de manera diferente a las funciones normales. Recuerde: al acceder a this en el m茅todo de un objeto, esta palabra clave corresponde al objeto al que pertenece el m茅todo. Sin embargo, esto no se aplica a las funciones de flecha. En cambio, this en tales funciones se refiere al contexto global (el objeto de window ). Considere el siguiente c贸digo que se puede ejecutar en la consola del navegador.

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

Si, desconcertado por el problema en cuesti贸n, mira MDN , puede encontrar informaci贸n de que las funciones de flecha tienen una forma m谩s corta de escritura que las expresiones funcionales y no est谩n vinculadas a sus propias entidades, arguments , super o new.target . Las funciones de flecha son m谩s adecuadas para su uso como funciones ordinarias, en lugar de m茅todos de objeto; no pueden usarse como constructores.

Escucharemos MDN y no utilizaremos funciones de flecha como m茅todos de objeto.

Usando esto en funciones regulares


Cuando una funci贸n regular est谩 en alcance global, la palabra clave utilizada en ella estar谩 vinculada al objeto de la window . El siguiente es un ejemplo en el que la funci贸n de test se puede ver como un m茅todo del objeto de window .

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

Sin embargo, si la funci贸n se ejecuta en modo estricto, entonces se escribir谩 undefined en este , ya que en este modo los enlaces predeterminados est谩n deshabilitados. Intente ejecutar el siguiente ejemplo en la consola del navegador.

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

Llamar a esto desde una funci贸n que se declar贸 fuera del objeto y luego se asign贸 como m茅todo


Considere el ejemplo del objeto dog que ya conocemos. Como m茅todo de este objeto, puede asignar la funci贸n de chase declarada fuera de 茅l. No hab铆a m茅todos en el objeto dog , hasta que creamos el m茅todo foo , al que se asign贸 la funci贸n de chase . Si ahora llama al m茅todo dog.foo , se dog.foo la funci贸n de chase . La palabra clave this , a la que se accede en esta funci贸n, apunta al objeto dog . Y la funci贸n de chase , al intentar llamarla como una funci贸n independiente, se comportar谩 incorrectamente, ya que con este enfoque apuntar谩 a un objeto global que no tiene las propiedades a las que, en esta funci贸n, accedemos a trav茅s de this .

 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(); //      

Palabra clave nueva y esto


La palabra clave this se usa en las funciones de constructor que se usan para crear objetos, ya que permite, de manera universal, trabajar con muchos objetos creados con dicha funci贸n. JavaScript tambi茅n tiene funciones de constructor est谩ndar con las que, por ejemplo, puede crear objetos de tipo Number o String . Funciones similares, determinadas por el programador por su cuenta, le permiten crear objetos cuya composici贸n de propiedades y m茅todos se establece por s铆 mismos.

Como ya entendi贸, me gustan los perros, por lo que describiremos una funci贸n de constructor para crear objetos como Dog que contienen algunas propiedades y m茅todos.

 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;   }; } 

Cuando se llama a una funci贸n de constructor usando la new palabra clave, this apunta a un nuevo objeto que, usando el constructor, se suministra con propiedades y m茅todos.

Aqu铆 se explica c贸mo trabajar con constructores JavaScript est谩ndar.

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

Ahora trabajemos con la funci贸n de constructor Dog reci茅n creada.

 //      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: 茠} 

Aqu铆 hay otro ejemplo del uso de funciones de constructor.

 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. 

Sobre la importancia de la nueva palabra clave


Cuando se llama a la funci贸n de constructor usando la new palabra clave, this apunta a un nuevo objeto que, despu茅s de un poco de trabajo, ser谩 devuelto por esta funci贸n. La palabra clave this en esta situaci贸n es muy importante. Por qu茅 La cuesti贸n es que, con su ayuda, es posible, utilizando una sola funci贸n de constructor, crear muchos objetos del mismo tipo.

Esto nos permite escalar la aplicaci贸n y reducir la duplicaci贸n de c贸digo. Para comprender la importancia de este mecanismo, piense en c贸mo se organizan las cuentas de redes sociales. Cada cuenta puede ser una instancia de un objeto creado usando la funci贸n de constructor Friend . Cada uno de estos objetos se puede llenar con informaci贸n de usuario 煤nica. Considere el siguiente c贸digo.

 // - 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() ) ; 

Resumen


De hecho, el uso de la this en JavaScript no se limita a los ejemplos descritos anteriormente. Por lo tanto, una serie de estos ejemplos podr铆a incluir el uso de las funciones call , apply y bind . Dado que este material est谩 destinado a principiantes y tiene como objetivo explicar los conceptos b谩sicos, no los tocamos aqu铆. Sin embargo, si ya ha formado una comprensi贸n inicial de this , puede descubrir f谩cilmente estos m茅todos. Lo principal es recordar que si no puede entender algo la primera vez, no deje de aprender, practique, lea materiales sobre el tema que le interesa. En uno de ellos, seguramente se encontrar谩 con algo (alg煤n tipo de frase exitosa, por ejemplo) que lo ayudar谩 a comprender lo que antes no pod铆a entender.

Estimados lectores! 驴Ha tenido dificultades para comprender esta palabra clave en JavaScript?

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


All Articles