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();
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();
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() );
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();
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'); 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();
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?