Object.prototype.\_\_proto\_\_
==============================

**Advertencia:** Cambiar la propiedad `[[Prototype]]` de un objeto es, por como los navegadores modernos optimizan las propiedades de acceso, una operación muy lenta en ***todos*** los navegadores y motores JavaScript. Los efectos en el rendimiento de alterar la herencia son muchos y delicados, y no se limita simplemente al tiempo que necesita la asignación `obj.__proto__ = ...` sentencia, sin embargo afecta a ***cualquier*** código que tiene acceso a ***cualquier*** objeto cuya propiedad `[[Prototype]]` ha sido alterada, por lo que se debe de tener mucho cuidado.Si el rendimiento en tu aplicación es necesario, deberías evitar modificar la propiedad `[[Prototype]]` de un objeto. En su lugar, crea un objecto nuevo con la propiedad `[[Prototype]]` deseada usando `Object.create()`.

**Advertencia:** Mientras `Object.prototype.__proto__` es soportado hoy día por la mayoría de navegadores, su existencia y comportamiento exacto solo ha sido estandarizado en la especificación ECMAScript 6 como una característica de legado y para asegurar la compatibilidad entre los navegadores web. Para tener un mejor soporte, es recomendable que se utilice `Object.getPrototypeOf()` para obtener el prototipo de un objeto.

La propiedad `__proto__` de `Object.prototype` (en-US) es una propiedad llamada de acceso (una función getter y también función setter) que provee acceso al interior de `[[Prototype]]` (ya sea un objeto o `null`) del objeto a través del cual se accede a ella.

El uso de la propiedad `__proto__` es polémico actualmente, y está rechazado. Originalmente, nunca fué incluído en la especificación de EcmaScript, pero los navegadores modernos decidieron implementarla de todas maneras. Sólo actualmente, `la propiedad __proto__` ha sido estandarizada en la especificación del lenguaje ECMAScript 6, para asegurar la compatibilidad entre navegadores, por lo tanto, esta será soportada en el futuro. Actualmente está obsoleta en favor de `Object.getPrototypeOf`/`Reflect.getPrototypeOf` (en-US) y `Object.setPrototypeOf`/`Reflect.setPrototypeOf` (en-US) (aunque todavía establecer el `[[Prototype]]` de un objeto es una operación muy lenta, por lo que si nos preocupa el rendimiento, debemos de evitarlo).

La propiedad `__proto__` puede ser usada también en un objeto definido de forma literal, para establecer el `[[Prototype]]` en la creación de este, como alternativa a `Object.create()`. Ver: object initializer / literal syntax (en-US).

Síntaxis
--------


```js
var shape = {};
var circle = new Circle();

// Establecer el objeto prototype.
// OBSOLETO. Esto es solo un ejemplo. NO HACER ESTO en código real.
shape.__proto__ = circle;

// Obtener el objeto prototype
console.log(shape.__proto__ === circle); // true
```


Nota: esto es, dos guiones bajos, seguidos de cinco carácteres "proto", seguido de dos guiones bajos mas.

Descripción
-----------

La función getter `__proto__`el valor interno del `[[Prototype]]` de un objeto. Para objetos creados usando un objeto literal, el valor es `Object.prototype` (en-US). Para objetos creados usando literales de array, este valor es `Array.prototype`. Para funciones, este valor `Function.prototype` (en-US). Para objetos creados utilizando el operador new fun, donde **fun** es una función constructora incluída en JavaScript (`Array`, `Boolean`, `Date`, `Number`, `Object`, `String`, etcétera—incluyendo nuevos contrusctores conforme JavaScript evoluciona), este valor es `fun.prototype`. (Esto es, si el constructor no devuelve un objeto de forma explícita, o el `fun.prototype` ha sido reasignado desde que la instancia fué creada).

El `__proto__` setter la mutación del objeto `[[Prototype]]` de un objeto. El objeto debe ser extensible según `Object.isExtensible()`: si no, un `TypeError` es lanzado. El valor proveído debe ser un objeto o `null`. Provetendo otro tipo de valor no hará nada.

Para entender como los prototipos son usados para herencia, ver el artículo Inheritance and the prototype chain (en-US).

La propiedad `__proto__` es una simple propiedad de acceso a `Object.prototype` (en-US) que consiste en una función getter y setter. Un acceso a la propiedad `__proto__` que eventualmente consulta `Object.prototype` (en-US) encontrará esta propiedad, pero un acceso que no consulta `Object.prototype` (en-US) no lo encontrará. Si alguna otra propiedad `__proto__` es encontrada antes `Object.prototype` (en-US) es consultada, esta propiedad sera ocultada por la encontrada en `Object.prototype` (en-US).

Especificaciones
----------------

| Specification |
| --- |
| ECMAScript Language Specification # sec-object.prototype.\_\_proto\_\_ |

Compatibilidad con navegadores
------------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Notas de compatibilidad
-----------------------

Mientras la especificación ECMAScript 2015 (ES6) dicta que el soporte para `__proto__` es requerido *solo* para navegadores web (a pesar de ser normativo), otros medios pueden soportarlo por uso de legado.

Ver también
-----------

* `Object.prototype.isPrototypeOf()`
* `Object.getPrototypeOf()`
* `Object.setPrototypeOf()`