Los objetos en JavaScript pueden generar confusión para quienes recién comienzan a explorar este lenguaje. Es común sentir incertidumbre al estudiar a fondo cómo funcionan los objetos en JavaScript, pero tranquilo, este es un aspecto crucial que necesita ser abordado con calma para ser comprendido plenamente.
¿Qué son y cómo funcionan los tipos y estructuras de datos en JavaScript?
Cada lenguaje de programación tiene sus tipos y estructuras de datos, incluyendo JavaScript. Entre los más comunes, encontramos:
Strings: Cadenas de texto.
Números: Valores numéricos, que pueden incluir enteros y decimales.
Booleanos: Variables que pueden ser solo true o false.
Arrays: Listas que pueden albergar cualquier otro tipo de dato del lenguaje.
Además, existen también los objetos, los cuales pueden compararse con otros elementos más complejos como en otros lenguajes de programación.
¿En qué se diferencian los objetos literales de las instancias de objetos?
La diferencia entre objetos literales y las instancias de objetos en programación orientada a objetos (POO) es fundamental:
Objetos Literales:
En JavaScript, son colecciones de pares clave-valor, encerrados dentro de llaves {}.
Ejemplo: { nombre: "Juan", edad: 30 }.
Instancias de Objetos:
Se basan en clases, o en el caso de JavaScript, en prototipos.
Se crean utilizando una función constructora y la palabra clave new.
Los objetos literales proporcionan una sintaxis sencilla, mientras que las instancias creadas a partir de constructores (o usando class en versiones más recientes de JavaScript) ofrecen más capacidades de reutilización y organización.
¿Cuál es la importancia del prototipo en JavaScript?
JavaScript es un lenguaje basado en prototipos, no en clases como muchos otros lenguajes orientados a objetos. Esto significa que:
Cada objeto puede tener un objeto prototipo, que actúa como un modelo del que hereda métodos y propiedades.
La propiedad __proto__ en cada objeto remite al prototipo al que pertenece. Esto permite la herencia de métodos y atributos.
Ejemplo de Prototipos en JavaScript
// Función constructora como prototipofunctionStudent(name, age){this.name= name;this.age= age;}// Creando una instancia del prototipoconst juanita =newStudent("Juanita",25);// Herencia de atributos y métodos.
Aquí, juanita hereda los atributos name y age del prototipo Student.
¿Qué es la herencia prototípica y cómo se refleja en objetos, arrays y funciones?
Cada Array u Objeto en JavaScript tiene asociado un prototipo. Por ejemplo:
Arrays: Tienen un prototipo Array que ofrece métodos como push() que permite agregar elementos.
Objetos: Se basan en el prototipo Object, proporcionando métodos como hasOwnProperty().
Esto permite que listas o estructuras complejas cuenten ya con métodos predefinidos sin necesidad de redefinirlos cada vez.
¿Cómo afectan los objetos y prototipos a la programación en JavaScript?
La programación basada en prototipos de JavaScript ofrece:
Reutilización de métodos: Reducción en la necesidad de definir métodos para cada instancia individual.
Flexibilidad y dinamismo: Los programadores pueden añadir nuevos métodos al prototipo en tiempo de ejecución.
Aprender a manejar objetos y prototipos es crucial para sacar el máximo potencial a JavaScript, ya que todo, desde objetos literales hasta arrays, dependen de esta arquitectura. Profundizar en estos conceptos es fundamental para una programación más eficiente y ordenada.
Con todos estos avances y herramientas a tu disposición, puedes estar seguro de que seguirás avanzando y afrontando cualquier desafío que se te presente en el camino de la programación en JavaScript.
Objetos y prototipos en JavaScript: diferencias y usos
Un objeto en JavaScript es una instancia del prototipo Object que es creado de forma “nativa” por Js… jajaja creo que esa definición empieza a estar en un ámbito “existencial”.
Excelente aporte! Enriqueciendo un poco lo anterior, this hace referencia al objeto que está ejecutando una función en un momento específico. Eso es enlazamiento o binding.
Pero se pone mucho más complejo que eso, incluso más que ésta clase del curso 🙃 ya que** JavaScript tiene 5 formas de crear un enlazamiento:**
1. Lexical Binding: El que se crea con las arrow functions.
2. New Binding: Cuando creamos una nueva instancia con new.
** 3. Explicit Binding:** Invocación indirecta, cuando usamos algún método de invocación.
4. Implicit Binding: Invocación de método, cuando invocamos al método de un objeto. Como lo que señalaba Juan.
5. Default Binding: Invocación directa, cuando usamos una función que tiene un punto antes this tomará el valor del objeto que esté a la izquierda del punto.
Vengo de aprender eso para ahora poder entender POO a profundidad. Esos apuntes los tomé de un video de YouTube de Sacha Lifszyc sobre cómo funciona this. Búsquenlo como "this la cocina del código" porque este editor no me deja poner el link.
Un objeto en JavaScript es una colección de propiedades. Una propiedad en JavaScript es simplemente una asociación entre un nombre (llave) y un valor. Cuando este valor es una función, podemos decir que se trata de un método.
Los objetos en JavaScript, al ser un lenguaje basado en prototipos, heredan propiedades de otros objetos por medio del prototipo.
Podemos construir objetos de dos formas: De la "nada" (o también llamado objeto literal) o clonando un objeto ya existente. En la mayoría de lenguajes que soportan prototipos existe una clase raíz (por lo general llamada Object) que tiene las propiedades mínimas necesarias para la creación de objetos.
Conceptos:Objeto: Instanciación de una Clase, Prototipo, o Objeto Prototipo.
Prototipo: Agrupación de métodos donde un objeto específico tiene acceso.
Objeto Prototipo: Es un objeto omnipresente preestablecido, dando por resultado que todo objeto instanciado en javascript será heredado directa o indirectamente del Objeto Prototipo y mediante el atributo __proto__ vamos se podrá acceder a su respectivo prototipo.
En imagen podemos ver esta herencia o también llamada Prototype Chain( ver enlace );
Reto: En JavaScript existen dos tipos de objetos: los objetos literales que son los que creamos con las llaves y los objetos instanciados desde las clases. Ambos tienen algo en comun. Y es que los dos son instancias de un prototipo llamado Object. Este ultimo es como la madre de todos los objetos. Entonces, cada vez que creamos un objeto, se le asigna metodos heredados de la clase Object. Finalmente podemos decir lo siguiente: cuando cremos un objeto con corchetes, este va a ser una instancia de la clase Object. Y cuando creamos el otro tipo de objeto no solo sera una instancia de la clase Object sino tambien de la instancia de la cual la estamos creando.
De esta manera entendi la clase, si me equivoco corrijanme. gracias :D
Agregando a toda está increíble clase llena de conocimientos y referencias agrego lo siguiente:
Definiciones Claves
this: Esta palabra reservada hace referencia al objeto actual donde se está ejecutando. Lo utilizamos Por ejemplo: Para crear funciones reutilizables que se puedan adaptar al contexto donde se están ejecutando. Ejemplos aquí
new: Es un operador, el cual nos permite crear instancias de un objeto definido por el usuario o de los objetos integrados que tienen una función constructora (Object, Array, String)
prototype: Es la propiedad donde definimos todas nuestras propiedades y métodos que queremos que sean heredados. Esta es un repositorio, el cual también es un objeto.
Prototipos: Es el mecanismo que utilizamos para que los objetos en JS hereden características entre sí.
** Proto**: Es la propiedad que guarda los atributos y métodos definidos en prototype. Es importante recalcar que cuando se crea un objeto y se guardan valores acá, ambos siempre hacen referencia al mismo objeto.
Y para responder qué es un objeto?
Todo en JS es un objeto :'D.
Se podría resumir como una colección de valores, organizados de manera clave-valor(?
Herencia y la cadena de prototipos
JavaScript provoca cierta confusión en desarrolladores con experiencia en lenguajes basados en clases (como Java o C++), por ser dinámico y no proporcionar una implementación de clases en sí mismo (la palabra clave class se introdujo en ES2015, pero sólo para endulzar la sintaxis, ya que JavaScript sigue estando basado en prototipos).
En lo que a herencia se refiere, JavaScript sólo tiene una estructura: objetos. Cada objeto tiene una propiedad privada (referida como su [[Prototype]]) que mantiene un enlace a otro objeto llamado su prototipo. Ese objeto prototipo tiene su propio prototipo, y así sucesivamente hasta que se alcanza un objeto cuyo prototipo es null. Por definición, null no tiene prototipo, y actúa como el enlace final de esta cadena de prototipos.
Casi todos los objetos en JavaScript son instancias de Object que se sitúa a la cabeza de la cadena de prototipos.
A pesar de que a menudo esto se considera como una de las principales debilidades de JavaScript, el modelo de herencia de prototipos es de hecho más potente que el modelo clásico. Por ejemplo, es bastante simple construir un modelo clásico a partir de un modelo de prototipos.
Herencia con la cadena de prototipos
Heredando propiedades
Los objetos en JavaScript son "contenedores" dinámicos de propiedades (referidas como sus propiedades particulares). Los objetos en JavaScript poseen un enlace a un objeto prototipo. Cuando intentamos acceder a una propiedad de un objeto, la propiedad no sólo se busca en el propio objeto sino también en el prototipo del objeto, en el prototipo del prototipo, y así sucesivamente hasta que se encuentre una propiedad que coincida con el nombre o se alcance el final de la cadena de prototipos.
Siguiendo el estándar ECMAScript, la notación algunObjeto.[[Prototype]] se usa para designar el prototipo de algunObjeto. A partir de ECMAScript 2015, se accede al [[Prototype]] utilizando los accesores Object.getPrototypeOf() y Object.setPrototypeOf(). Esto es equivalente a la propiedad JavaScript proto que no es estándar pero es el de-facto implementado por los navegadores.
No debe confundirse con la propiedad de las funciones func.prototype, que en cambio especifican el [[Prototype]] a asignar a todas las instancias de los objetos creados por la función dada cuando se utiliza como un constructor. La propiedad Object.prototype representa el prototipo del objeto Object.
buena analogía, pero también es decir que como explica Juan, todo es un objeto, que hereda del prototipo default, como a java y c son las librerías, a Js es Proto, y es en mi opinión muy práctico, venimos con mucho trabajo ya adelantado, eso es lo poderoso de JS.
Una de las mejores clases que he tomado en platzi en los 6 meses que llevo ya
Este es un resumen de conceptual de lo presentado en esta clase. Ojalá a alguien le sea útil.
.
.
Objeto literal
Los objetos literales se distinguen de los objetos de la POO porque no son instancias de un prototipo creado por el desarrollador.
.
Sin embargo los objetos literales son instancias del prototipo Object creado por defecto en JavaScript.
.
Un prototipo es una estructura de código a partir de la cual se crean objetos, ya que guarda los atributos y métodos que luego podrán ser heredados por sus instancias.
.
Podemos pensarlo como un "molde" de objetos.
.
Los objetos son estructuras de datos formadas por métodos y atributos, los cuales hereda de su prototipo padre.
.
De modo que los objetos son son instancias de ese prototipo, particularmente cuando dicho prototipo fue creado por el desarrollador (en caso contrario se llaman objetos literales).
.
Atributos
Dentro de los objetos se pueden guardar atributos para guardar en ellos la información la información que se les asocia. Así, toda la información del objeto se guarda en sí mismo.
.
Métodos
Dentro de los objetos también pueden guardarse métodos, los cuales son funciones que, entre otras cosas, permiten actualizar la información guardada en los atributos de forma segura.
.
Atributo __proto__
Es el nombre que se le da al atributo donde se guardan los métodos que las estructuras de datos tienen por defecto en JavaScript.
.
El atributo __proto__ se hereda a partir de los prototipo por defecto de JavaScript para cada estructura de datos en particular, por ejemplo de los prototipos Object y Array.
.
El atributo __proto__ también se hereda a los objetos, ya que éstos son a la vez instancias de algún prototipo creado por el desarrollador y del prototipo Object.
¿Qué es "this" (este)?
Es posible que hayas notado algo un poco extraño en nuestros métodos. Mira esto, por ejemplo:
Probablemente te estés preguntando qué es "this". La palabra clave this se refiere al objeto actual en el que se está escribiendo el código, por lo que en este caso this es equivalente a la persona. Entonces, ¿por qué no escribir persona en su lugar? Como verás en el artículo JavaScript orientado a objetos para principiantes cuando comenzaremos a crear constructores, etc., this es muy útil: siempre asegurará que se usen los valores correctos cuando cambie el contexto de un miembro (por ejemplo, dos diferentes instancias de objetos persona) pueden tener diferentes nombres, pero querráx usar su propio nombre al decir su saludo).
Vamos a ilustrar lo que queremos decir con un par de objetos persona simplificados:
var persona1 ={nombre:'Chris',saludo:function(){alert('¡Hola!, Soy '+this.nombre+'.');}}var persona2 ={nombre:'Brian',saludo:function(){alert('¡Hola!, Soy '+this.nombre+'.');}}
En este caso, persona1.saludo() mostrará "¡Hola!, Soy Chris"; persona2.saludo() por otro lado mostrará "¡Hola!, Soy Brian", aunque el código del método es exactamente el mismo en cada caso. Como dijimos antes, this es igual al objeto en el que está el código; esto no es muy útil cuando se escriben objetos literales a mano, pero realmente se vuelve útil cuando se generan objetos dinámicamente (por ejemplo, usando constructores) Todo se aclarará más adelante.