Object.prototype.__proto__

Este articulo necesita una revisión técnica. Cómo puedes ayudar.

Este articulo necesita una revisión editorial. Cómo puedes ayudar.

Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.

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 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 y Object.setPrototypeOf/Reflect.setPrototypeOf (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.

Síntaxis

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. Para objetos creados usando literales de array, este valor es Array.prototype. Para funciones, este valor Function.prototype. 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. Para objetos creados usando el operador new fun, donde fun es una función definida en un script, este valor es el valor de 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.

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

Especificaciones

Especificaciones Estado Comentario
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.prototype.__proto__' in that specification.
Standard Incluída en el anexo (normativa) para características de legado ECMAScript para navegadores web (observar que la especificación de codificación es lo que ya está en las implementaciones).

Compatibilidad de navegadores

Caracteristica Chrome Firefox (Gecko) Internet Explorer Opera Safari
Soporte básico (Yes) (Yes) 11 (Yes) (Yes)
Caracteristica Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Soporte básico (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

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

Etiquetas y colaboradores del documento

 Colaboradores en esta página: mishelashala, adelamata
 Última actualización por: mishelashala,