W3docs

Métodos de objetos JavaScript y this

Aprende los métodos de objetos JavaScript y la palabra clave this: definición de métodos, resolución de this en tiempo de llamada, préstamo de métodos con call/apply/bind y funciones flecha.

Introducción a los métodos de objeto en JavaScript

Los objetos JavaScript son colecciones de propiedades, y los métodos de un object son funciones almacenadas como propiedades de esos objetos. Los métodos permiten que un object haga cosas con sus propios datos, no solo guardarlos.

Esta guía explica cómo definir y llamar métodos, cómo la palabra clave this conecta un método con su objeto, cómo leer y modificar el estado del object desde dentro de los métodos, y el error más común en el lenguaje: perder this en los callbacks. Finaliza con la diferencia práctica entre funciones regulares y funciones flecha.

Definición y llamada de métodos

Un método es simplemente una propiedad cuyo valor es una función. La sintaxis abreviada greet() { ... } es la forma moderna de escribirlo; es equivalente a greet: function() { ... }.

javascript— editable

greet es un método del object user. Utiliza this.name para acceder a la propiedad name del object, demostrando cómo los métodos pueden actuar sobre los datos dentro de su propio object. Se llama a un método con la misma sintaxis de punto utilizada para cualquier propiedad, seguida de (): user.greet().

La palabra clave this en los métodos

La palabra clave this hace referencia al objeto antes del punto en el momento en que se llama al método. Se determina en el momento de la llamada, no cuando se escribe la función — esto es lo que hace que this sea flexible pero también propenso a errores.

Ejemplo: Uso de this en métodos

javascript— editable

En el método details, this se utiliza para referirse al objeto person en sí, lo que permite acceder a sus propiedades name y age para producir un mensaje personalizado. Como details fue llamado como person.details(), this es person.

Modificación de propiedades del objeto

Los métodos no solo sirven para recuperar valores de propiedades, sino también para actualizarlos.

Ejemplo: Actualización de propiedades

javascript— editable

El método promote actualiza la propiedad jobTitle y muestra un mensaje que refleja el cambio. Esto ilustra cómo los métodos pueden modificar dinámicamente el estado interno de un object.

Uso de métodos para cálculos

Los métodos también son útiles para realizar cálculos basados en propiedades del objeto.

Ejemplo: Cálculo de valores

javascript— editable

El método area calcula el área del rectángulo usando las propiedades width y height. Este ejemplo muestra cómo los métodos pueden encapsular funcionalidades que operan sobre los datos almacenados dentro de un object.

Préstamo de métodos

Dado que this se resuelve en el momento de la llamada, la misma función puede ejecutarse sobre diferentes objetos. Esta es la base del préstamo de métodos.

Ejemplo: Préstamo de un método

javascript— editable

Aquí, el método speak del object dog se asigna al object cat. Cuando se llama como cat.speak(), this.name hace referencia a Whiskers, demostrando que this depende de cómo se llama al método, no de dónde fue definido.

Cuando no se puede reasignar el método pero aún se quiere tomarlo prestado, se puede usar call, apply o bind para establecer this explícitamente. Consulta Decoradores y reenvío, call/apply para un tratamiento completo.

javascript— editable

introduce.call(alice) ejecuta introduce con this establecido en alice, aunque introduce es una función independiente y no una propiedad de ninguno de los dos objetos.

Encadenamiento de métodos

El encadenamiento de métodos permite llamar a varios métodos en una sola expresión haciendo que cada método retorne this — el propio objeto. El objeto retornado se convierte en el destino de la siguiente llamada.

Ejemplo: Implementación del encadenamiento de métodos

javascript— editable

Cada método en calculator modifica value y retorna el objeto, lo que permite las llamadas encadenadas. Este patrón mejora la legibilidad y es la base de las API fluidas como jQuery y muchos helpers de array.

Funciones tradicionales vs. funciones flecha

En JavaScript, el comportamiento de la palabra clave this varía significativamente entre las funciones tradicionales y las funciones flecha. Entender esta diferencia es lo más importante para escribir código con this libre de errores.

Advertencia

Ten siempre cuidado con this cuando pierde su contexto en callbacks o al pasar un método como argumento. En esos casos, this puede no referirse al objeto de origen — puede ser undefined (en modo estricto / módulos) o el objeto global.

Funciones tradicionales

En una función tradicional, this se determina por cómo se llama a la función. Así es como varía:

  • Contexto global: Cuando se llama a una función sin ningún objeto antes del punto, this es el objeto global (window en navegadores, global en Node) en código no estricto, y undefined en modo estricto o en módulos.
javascript— editable
  • Métodos de objeto: Cuando se llama a una función como método de un object, this hace referencia a ese object.
javascript— editable
  • Controladores de eventos: Cuando se usa una función tradicional como controlador de eventos, this hace referencia al elemento que recibió el evento.
<button id="myButton">Click me</button>
<p id="output">Click the button to see the result.</p>

<script>
  document.getElementById("myButton").addEventListener("click", function () {
    document.getElementById("output").innerHTML = "This button was clicked: " + this;
  });
</script>

Funciones flecha

Las funciones flecha no tienen su propio this. En cambio, capturan this del ámbito léxico circundante en el momento en que se definen. Esto las hace ideales para callbacks dentro de un método, donde se quiere mantener el this del método.

  • Contexto consistente en callbacks: Útil cuando this debe mantenerse igual dentro de un callback anidado en un método.
javascript— editable

Aquí logActions usa una función flecha dentro de forEach. La función flecha hereda this de logActions, por lo que referencia correctamente userProfile.name. Una función tradicional pasada a forEach recibiría su propio this (el objeto global o undefined), por lo que this.name fallaría.

Información

No uses una función flecha para definir un método de objeto de nivel superior cuando dependas de this. Una función flecha no tiene this propio, por lo que hereda del ámbito circundante (generalmente el ámbito global) en lugar del object — this.name sería undefined.

Ejemplo práctico

Veamos un ejemplo realista con un object que gestiona el perfil en línea de un usuario, demostrando ambos tipos de funciones lado a lado:

javascript— editable

Este ejemplo muestra claramente cómo las funciones flecha ayudan a mantener el contexto correcto (this), especialmente en callbacks anidados donde el this dinámico de una función tradicional fallaría silenciosamente.

Pérdida de this y cómo solucionarlo

El error clásico: extraes un método a una variable o lo pasas como callback, y this ya no es el object.

javascript— editable

Cuando counter.show se desvincula, llamar a show() no tiene ningún objeto antes del punto, por lo que this se pierde. bind retorna una nueva función cuyo this queda fijado permanentemente. La misma idea se aplica a setTimeout(obj.method, 1000) (roto) frente a setTimeout(() => obj.method(), 1000) (funciona). Para profundizar, consulta Enlace de funciones.

Conclusión

Los métodos de objeto le dan comportamiento a tus datos, y la palabra clave this es lo que conecta un método con su object. La regla clave: this es el objeto antes del punto en el momento de la llamada, por lo que puede cambiar dependiendo de cómo se invoque una función. Las funciones regulares obtienen un this dinámico; las funciones flecha capturan this léxicamente, lo cual es exactamente lo que se necesita para los callbacks pero incorrecto para los métodos de nivel superior. Cuando se pierde this, utiliza bind, call o apply.

Para profundizar, explora referencias de objetos y comportamiento de copia, funciones constructoras y new, y decoradores con call/apply.

Práctica

Práctica
¿A qué hace referencia la palabra clave 'this' en JavaScript?
¿A qué hace referencia la palabra clave 'this' en JavaScript?
Práctica
¿Por qué deberías evitar las funciones flecha para métodos de objeto de nivel superior que usan this?
¿Por qué deberías evitar las funciones flecha para métodos de objeto de nivel superior que usan this?
Was this page helpful?