# Instancia (informática)

Una instancia (en inglés, instance) es la particularización, realización específica u ocurrencia de una determinada clase, entidad (modelo entidad-relación) o prototipo.
En los lenguajes de programación orientada a objetos un objeto es una instancia de una clase. Esto es, un miembro de una clase que tiene atributos en lugar de variables. En un contexto del mundo real, podríamos pensar en "Casa" como una clase y en un chalet como una instancia de esta e incluso otro chalet u otro tipo de casa como puede ser un apartamento como otra instancia. En este caso no importa el tipo de casa, si fuese de nuestro interés modelarlo y especificarlo, diferenciaríamos entre un chalet y un apartamento con dos clases, entidades o prototipos diferentes, c.f. herencia (informática).

## Etimología

El término en informática procede del inglés, en donde instance viene del significado que podría traducirse por caso o ejemplo en español. Aunque la palabra existe en el idioma inglés por incorporación desde el latín como instantia (que es de donde lo hace también la palabra en español), pero posteriormente también adquirió (del latín igualmente) parte de la semántica de instāns, que en nuestro caso derivó únicamente en instante. Esta incorporación desde el inglés tendría la consideración de préstamo semántico, aunque esta acepción no está contemplada todavía por la Real Academia Española.

## Programación basada en clases

En este apartado hablaremos de la programación orientada a objetos basada en clases, que es la que implementa la mayoría de lenguajes de programación orientados a objetos. En el modelo basado en prototipos, que es el de lenguajes como JavaScript, los términos que se refieren a clases han de sustituirse por los prototipos de los objetos, pero por lo demás, son de aplicación similar.
En este modelo, un objeto tiene una referencia a la clase a la que pertenece y, por tanto, puede llamar a los métodos de instancia que hayan sido declarados como de instancia, así como a todos aquellos que hayan sido heredados por la jerarquía de herencia estática entre clases.
Ciertos lenguajes de programación permiten utilizar clases mixin, que permiten además realizar asociaciones entre instancias de objetos para establecer relaciones similares a la herencia en tiempo de ejecución.

### Clases como objetos

Multitud de lenguajes de programación basados en clases proporcionan mecanismos de reflexión o introspección, esto es, permiten que el programa pueda observar (e incluso modificar) su propia estructura de alto nivel. Si estos mecanismos siguen el paradigma de orientación a objetos también, entonces las clases serán representadas también como instancias de objetos. En particular, si el lenguaje no permite dos definiciones de una misma clase (puede hacerlo para permitir ejecuciones concurrentes de distintas versiones de una clase) entonces las clases serán representadas utilizando un Singleton. En Java, por ejemplo, si tenemos una clase definida como:
Podremos acceder a la instancia que representa la clase (y es una instancia de la clasejava.lang.Class<Perro>), en un programa principal de clase Main, del siguiente modo:

## Programación basada en prototipos

En el estilo de programación orientada a objetos basada en prototipos las instancias son los objetos creados a partir de los prototipos. En general, los prototipos también son objetos creados a partir de otros prototipos, con lo que las propiedades y métodos se heredan en la profundidad completa del árbol de herencia de prototipados.
En el caso particular de JavaScript, aunque no se puede cambiar el prototipo de un objeto una vez instanciado, sí se pueden cambiar las propiedades y métodos que tiene el prototipo, afectando a todas las instancias (en profundidad) de ese prototipo. En el caso particular de este lenguaje, en el que todos los objetos son instancias de Object, modificar o añadir métodos a Object tendrá como consecuencia la modificación de esos métodos u objetos en todos los demás objetos que no los hayan redefinido posteriormente, incluyendo los ya instanciados. Este es el mecanismo que utilizan algunas bibliotecas de JavaScript para proporcionar funciones que no hayan implementado ciertos motores a ciertos objetos del lenguaje.