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

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