Esta página foi traduzida do inglês pela comunidade.Saiba mais e junte-se à comunidade MDN Web Docs.
Object.prototype.__proto__
Aviso:Cuidado: Alterando o[[Prototype]] 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çãoobj.__proto__ = ..., mas podem se estender paraqualquer código que tenha acesso aqualquer objeto cujo[[Prototype]] foi alterado. Se você se preocupa com desempenho, evite configurar o[[Prototype]] de um objeto. Ao invés disso, crie um novo objeto com o[[Prototype]] desejado usandoObject.create().
Aviso:Cuidado: EnquantoObject.prototype.__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 apenasObject.getPrototypeOf() seja usado em vez disso.
A propriedade__proto__ deObject.prototype é uma propriedade de acesso (uma função getter e uma setter) que expõe o interno[[Prototype]] (ou um objeto ounull) 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 deObject.getPrototypeOf/Reflect.getPrototypeOf eObject.setPrototypeOf/Reflect.setPrototypeOf (embora ainda, definir[[Prototype]] é 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[[Prototype]] na criação, como uma alternativa paraObject.create(). Veja:object initializer / literal syntax.
In this article
Sintaxe
var shape = {};var circle = new Circle();// Define o objeto prototype.// OBSOLETO. Isto é somente exemplo. NÃO FAÇA ISSO em código real.shape.__proto__ = circle;// Retorna o objeto prototypeconsole.log(shape.__proto__ === circle); // truevar shape = function () {};var p = { a: function () { console.log("aaa"); },};shape.prototype.__proto__ = p;var circle = new shape();circle.a(); //aaaconsole.log(shape.prototype === circle.__proto__); //true//ouvar shape = function () {};var p = { a: function () { console.log("a"); },};var circle = new shape();circle.__proto__ = p;circle.a(); // aconsole.log(shape.prototype === circle.__proto__); //false//oufunction test() {}test.prototype.myname = function () { console.log("myname");};var a = new test();console.log(a.__proto__ === test.prototype); //truea.myname(); //myname//ouvar fn = function () {};fn.prototype.myname = function () { console.log("myname");};var obj = { __proto__: fn.prototype,};obj.myname(); //mynameNota: 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[[Prototype]] de um objeto. Para objetos criado usando um objeto literal, este valor éObject.prototype. Para os objetos criados usando literais de matrizes, esse valor éArray.prototype. Para funções, esse valor éFunction.prototype. Para objeto criados usandonew fun, ondefun é 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 é semprefun.prototype. Para objetos criados usandonew fun, ondefun é uma função definida em um script, esse valor é o valor defun.prototype. (Ou seja, se o construtor não retornou um outro objeto explicitamente, ou ofun.prototype foi reatribuído desde que a instância foi criada).
O setter__proto__ permite ao[[Prototype]] de um objeto sejá mutável. O objeto deve ser extensível de acordo comObject.isExtensible(): se não for, um erroTypeError é emitido. O valor fornecido deve ser um objeto ounull. Fornecer qualquer outro valor não fará nada.
Para entender como os prototypes são usados para herança, veja o artigo:Inheritance and the prototype chain.
A propriedade__proto__ é simplesmente uma propriedade acessoraObject.prototype consistindo de uma função getter e setter. Um acesso de propriedade para__proto__ que eventualmente consulteObject.prototype irá encontrar esta propriedade, mas um acesso que não consultaObject.prototype não a encontrará. Se alguma outra propriedade__proto__ for encontrada antes de consultarObject.prototype, essa propriedade irá ocultar a que encontrouObject.prototype.
Especificações
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-object.prototype.__proto__> |
Compatibilidade com navegadores
Notas de compatibilidade
Enquanto a especificação ECMAScript 2015 dita que o suporte para__proto__ é requeridosomente para navegadores (apesar de ser normativo), outros ambientes podem suportar também para uso legado.