Object..__proto__

Aviso: Cuidado: Alterando o [[]] de um objeto é, pela natureza que as engines do Javascript modernos otimizam os acessos à propriedades, uma operação muito lenta, em **TODOS **os mecanismos browsers e JavaScript. Os efeitos no desempenho de alteração na herança são sutis e distantes, e não se limitam simplesmente ao tempo gasto em na declaração obj.__proto__ = ..., mas podem se estender para qualquer código que tenha acesso a qualquer objeto cujo [[]] foi alterado. Se você se preocupa com desempenho, evite configurar o [[]] de um objeto. Ao invés disso, crie um novo objeto com o [[]] desejado usando Object.create().

Aviso: Cuidado: Enquanto Object..__proto__ é suportado hoje em dia em quase todos os navegadores, a existência e o comportamento exato foram padronizados na especificação ECMAScript 2015 como um recurso legado para assegurar compatibilidade com os navegadores. Para melhor suporte, recomenda-se que apenas Object.getOf() seja usado em vez disso.

A propriedade __proto__ de Object. é uma propriedade de acesso (uma função getter e uma setter) que expõe o interno [[]] (ou um objeto ou null) de um objeto o qual é acessado.

O uso de __proto__ é controverso, e foi desencorajado. Nunca foi incluído originalmente na especificação do idioma EcmaScript, mas os navegadores modernos decidiram implementá-lo de qualquer maneira. Somente recentemente, a propriedade __proto__ foi padronizada na especificação de linguagem ECMAScript 2015 para navegadores para garantir compatibilidade, e então ser suportada no futuro. É obsoleta a favor de Object.getOf/Reflect.getOf e Object.setOf/Reflect.setOf (embora ainda, definir [[]] é uma operação lenta que deve ser evitada se o desempenho for uma preocupação).

A propriedade __proto__ também pode ser usada em uma definição literal de objeto para definir o objeto [[]] na criação, como uma alternativa para Object.create(). Veja: object initializer / literal syntax.

Sintaxe

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

// Define o objeto .
// OBSOLETO. Isto é somente exemplo. NÃO FAÇA ISSO em código real.
shape.__proto__ = circle;

// Retorna o objeto 
console.log(shape.__proto__ === circle); // true
js
var shape = function () {};
var p = {
  a: function () {
    console.log("aaa");
  },
};
shape..__proto__ = p;

var circle = new shape();

circle.a(); //aaa

console.log(shape. === circle.__proto__); //true

//ou

var shape = function () {};
var p = {
  a: function () {
    console.log("a");
  },
};

var circle = new shape();
circle.__proto__ = p;

circle.a(); //  a

console.log(shape. === circle.__proto__); //false

//ou

function test() {}
test..myname = function () {
  console.log("myname");
};
var a = new test();

console.log(a.__proto__ === test.); //true

a.myname(); //myname

//ou

var fn = function () {};
fn..myname = function () {
  console.log("myname");
};

var obj = {
  __proto__: fn.,
};

obj.myname(); //myname

Nota: são dois underscores(underlines), seguidos de cinco caracteres "proto", seguidos por mais dois underscores(underlines).

Descrição

A função getter de __proto__ expõe o valor interno de [[]] de um objeto. Para objetos criado usando um objeto literal, este valor é Object.. Para os objetos criados usando literais de matrizes, esse valor é Array.. Para funções, esse valor é Function.. Para objeto criados usando new fun, onde fun é uma função construtora built-in fornecida pelo JavaScript (Array, Boolean, Date, Number, Object, String, e assim por diante — incluindo novos construtores adicionados como evolução do JavaScript), este valor é sempre fun.. Para objetos criados usando new fun, onde fun é uma função definida em um script, esse valor é o valor de fun.. (Ou seja, se o construtor não retornou um outro objeto explicitamente, ou o fun. foi reatribuído desde que a instância foi criada).

O setter __proto__ permite ao [[]] de um objeto sejá mutável. O objeto deve ser extensível de acordo com Object.isExtensible(): se não for, um erro TypeError é emitido. O valor fornecido deve ser um objeto ou null. Fornecer qualquer outro valor não fará nada.

Para entender como os s são usados para herança, veja o artigo:Inheritance and the chain.

A propriedade __proto__ é simplesmente uma propriedade acessora Object. consistindo de uma função getter e setter. Um acesso de propriedade para __proto__ que eventualmente consulte Object. irá encontrar esta propriedade, mas um acesso que não consulta Object. não a encontrará. Se alguma outra propriedade __proto__ for encontrada antes de consultar Object., essa propriedade irá ocultar a que encontrou Object..

Especificações

Specification
ECMAScript® 2026 Language Specification
# sec-object..__proto__

Compatibilidade com navegadores

Notas de compatibilidade

Enquanto a especificação ECMAScript 2015 dita que o suporte para __proto__ é requerido somente para navegadores (apesar de ser normativo), outros ambientes podem suportar também para uso legado.

Veja também