¿Qué es la palabra clave 'esto' en JavaScript (programación orientada a objetos)

El 'esto ' palabra clave en JavaScript es un concepto confuso para algunos:el significado de 'esto ‘cambios basados ​​en el contexto. Este artículo explica lo que ‘esto ' es.

Qué es la Programación Orientada a Objetos

Programación orientada a objetos es una forma de estructurar su código para que los datos se organicen en objetos . JavaScript admite la programación orientada a objetos y proporciona varias herramientas para ayudar a implementarla.

En pocas palabras, en lugar de tener un montón de variables abstractas separadas que describen un elemento, las combina en un solo objeto que representa ese elemento. También puede agregar funciones al objeto para que haga cosas, como actualizar los valores almacenados en el objeto o interactuar con otros objetos.

Por ejemplo , si está creando una aplicación que registra todos los automóviles que ha tenido, en lugar de tener variables separadas que contengan todas las marcas, modelos, colores, etc., para cada automóvil, tiene un objeto que contiene los datos de un solo coche. Esto facilita el manejo de grandes cantidades de datos y hace que su aplicación sea más fácil de estructurar. Si desea obtener toda la información de un automóvil determinado, puede agarrar ese objeto y saber que contiene todo lo que necesita saber sobre ese artículo específico.

Ámbitos y contextos

Aunque a menudo se usan indistintamente, ámbitoscontextos son ligeramente diferentes.

Un alcance define el acceso a la variable:si una variable es accesible para el código en la parte actual de la aplicación. Por ejemplo, no se puede acceder a una variable declarada dentro de una función fuera de ella, ya que son ámbitos diferentes. .

Un contexto, sin embargo, es el objeto principal del código que se está ejecutando. Como un objeto puede contener varios métodos (que son funciones), cada método tendrá un ámbito diferente. (las funciones en sí) con el mismo contexto (el objeto principal).

Vea más sobre variables y alcances aquí.

Entonces, ¿qué es esto ?

esto es una palabra clave en JavaScript. Se usa como usaría cualquier variable.

esto se refiere a este objeto en el que está trabajando, ahora mismo, donde este está escrito en el código . Es decir, se refiere al contexto actual. .

Si está trabajando en una funciónesto se refiere al objeto principal de la función. Si está trabajando en un objetoesto se refiere al objeto.

JavaScript trata muchas cosas como objetos , así que aquí hay un resumen de lo esto se refiere en cada escenario.

esto Fuera de Métodos, Funciones, Objetos

Si esto se usa solo, fuera de cualquier clase principal, objeto, función, se refiere al objeto global.

var testVar = 9;
console.log(this.testVar); // Prints 9

Arriba, una variable global testVar se define. Para probar que esto hace referencia al objeto global, puede intentar acceder a this.testVar – que devuelve 9.

esto en un método (enlace de método de objeto)

Los objetos en JavaScript son de diferentes clases. Las clases pueden tener métodos – funciones que se pueden ejecutar en cada objeto de la clase dada para hacer cosas con él.

Al escribir código para un método, este siempre se referirá al objeto.

Por ejemplo:

class Car {
    constructor(make, model) {
        this.make = make;
        this.model = model;
    }
}

var fordCar = new Car('Ford', 'Model T');

Arriba, un coche se define la clase. Entonces se pueden crear objetos con esta clase. El constructor El método (una función) se utiliza para establecer los valores del Coche clase cuando se crea establecer atributos para la variable esto .

En este caso, un objeto llamado fordCar es creado. Cuando se ejecuta el constructor, este se refiere al fordCar objeto y establece los valores de marca/modelo que se pasaron como parámetros.

Enlace de funciones explícitas

Es posible cambiar lo esto hace referencia dentro de un método de objeto mediante call()aplicar() métodos de ese objeto. llamar()aplicar() son métodos JavaScript integrados que están disponibles para todos objetos de cualquier clase. Ambos métodos funcionan de manera similar y se diferencian en cómo se les pasan los argumentos adicionales después de proporcionar el contexto.

class Car {
    constructor(make, model) {
        this.make = make;
        this.model = model;
    }

    // makeModel method will return the make of model of the current object
    makeModel(){
        return this.make + ' ' + this.model;
    }
}

var fordCar = new Car('Ford', 'Model T');
var toyotaCar = new Car('Toyota', 'Hilux');

fordCar.makeModel.call(toyotaCar);  // Will return "Toyota Hilux" - even though it was called from the fordCar model, as the call method changed the context
fordCar.makeModel.apply(toyotaCar);  // Will return "Toyota Hilux" - even though it was called from the fordCar model, as the apply method changed the context

esto en una Función

Como se explicó anteriormente, funciones tener ámbitos pero no proporciona un contexto . Entonces, dentro de una función independiente sin clase ni objeto principal, esto se referirá al contexto global.

var testVar = 9;

function testFunction(){
    console.log(this.testVar); // Prints 9
}

testFunction(); // Run the function defined above

Funciones y modo estricto

Modo estricto es una configuración opcional que se puede habilitar en JavaScript, lo que le impide hacer algunas cosas que normalmente puede hacer. Estas cosas tienden a ser cosas que se eliminarán de futuras revisiones de JavaScript o cosas que se consideran "descuidadas":código que es válido pero escrito de una manera que probablemente cause errores o sea difícil de interpretar.

Entonces, en modo estricto, este NO referirse al objeto global cuando se usa en una función independiente. No hace referencia a nada y devolverá indefinido .

'use strict';

var testVar = 9;

function testFunction(){
    console.log(this.testVar); // undefined
}

testFunction(); // Run the function defined above

esto en controladores de eventos HTML

Cuando este se llama desde dentro de un controlador de eventos en un elemento HTML, se refiere al propio elemento HTML.

<button onclick="console.log(this);">
    Print information on this HTML element
</button>

El código HTML anterior imprimirá información en