- Clase: Define el comportamiento, así como propiedades y métodos de un objeto. La clase actua como plantilla del objeto a la hora de instanciarlo.
- Entidad: Instancia de una clase. Esta entidad obtiene todos los métodos y propiedades de la clase en el momento de su creación.
Una instancia obtiene sus propiedades y métodos en el momento de su creación, por lo que una vez instanciada no podremos añadir ni modificarlos. De esta forma nos aseguramos que al instanciar una clase, cuando modifiquemos sus atributos o métodos las clases ya instanciadas no se verán afectadas.
A diferencia de los lenguajes basados en clases, no existe el concepto de entidad o clase, solo existen objetos. Los objetos pueden especificar sus propiedades al ser declarados o en ejecución. Esto permite que un objeto existente pueda ver modificados sus atributos una vez ya creado, lo que puede dar lugar a errores inesperados.
// Declaramos el atributo name
const person = {
name: "Arnau"
}
console.log(person.name) // Devuelve 'Arnau'
person.name = "Paco"
console.log(person.name) // Devuelve 'Paco'
Al no existir el concepto de clase en Javascript la herencia tiene lugar gracias a un prototype object, que es un objecto que actúa como plantilla definiendo todos los atributos y métodos de las clases que lo "hereden". Si un objeto sobrescribe una propiedad heredada no afectará al prototype, por lo que otros objetos no se verán afectados, en cambio, si modificamos el prototype, todas las clases que heredan de este si que se verán afectadas.
En Javascript todos los objetos tiene un atributo __proto__
que apunta a su prototype. Este atributo es seteado al usar new
para crear una nueva instancia.
Cuando hacemos new
las funciones usan su atributo prototype
para seterar el __proto__
del objeto.
Al usar new
para instanciar un objeto ocurre lo siguiente:
- Se crea el objeto genérico.
- Se asigna el
__proto__
de la instancia al objeto. - Se llama a la función
__proto__
constructor y se le asigna el scope dethis
.
El prototype es una propiedad de las funciones que se usa para setear el valor de __proto__ cuando se llama a la función usando new.
const randomFunction = function () {}
randomFunction.prototype
//devuelve un objeto con las keys "constructor" y "__proto__" de Object()