Skip to content

Instantly share code, notes, and snippets.

@arnausd23
Last active March 28, 2019 10:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arnausd23/61035e33bf79cf1c7df6d2d53dead709 to your computer and use it in GitHub Desktop.
Save arnausd23/61035e33bf79cf1c7df6d2d53dead709 to your computer and use it in GitHub Desktop.
JS Prototype article

Lenguajes basados en clases

  • 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.

Lenguages basados en prototipos

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'

Prototype object

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.

__proto__ y prototype

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 de this.

Constructor function

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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment