Entendendo a especificação ECMAScript, parte 2
Vamos praticar nossas incríveis habilidades de leitura da especificação um pouco mais. Se você não olhou o episódio anterior, agora é um bom momento para fazê-lo!
Pronto para a parte 2?
Uma maneira divertida de conhecer a especificação é começar com um recurso JavaScript que sabemos que existe e descobrir como ele está especificado.
Aviso! Este episódio contém algoritmos copiados da especificação ECMAScript de fevereiro de 2020. Eles eventualmente estarão desatualizados.
Sabemos que as propriedades são procuradas na cadeia de protótipos: se um objeto não possui a propriedade que estamos tentando ler, subimos na cadeia de protótipos até encontrá-la (ou encontrar um objeto que não tem mais um protótipo).
Por exemplo:
const o1 = { foo: 99 };
const o2 = {};
Object.setPrototypeOf(o2, o1);
o2.foo;
// → 99
Onde está definida a caminhada no protótipo?
Vamos tentar descobrir onde esse comportamento está definido. Um bom lugar para começar é uma lista de Métodos Internos do Objeto.
Existem [[GetOwnProperty]]
e [[Get]]
– estamos interessados na versão que não está restrita às propriedades próprias, então vamos com [[Get]]
.
Infelizmente, o tipo de especificação Descriptor de Propriedade também tem um campo chamado [[Get]]
, então, ao navegar pela especificação de [[Get]]
, precisamos distinguir cuidadosamente entre os dois usos independentes.