Reflexão JavaScript

Resumo : neste tutorial, você aprenderá sobre a reflexão JavaScript e a API Reflect no ES6.

O que é reflexão

Na programação de computadores, reflexão é a capacidade de um programa manipular variáveis , propriedades e métodos de objetos em tempo de execução.

Antes do ES6, o JavaScript já tinha recursos de reflexão, embora não fossem oficialmente chamados assim pela comunidade ou pela especificação. Por exemplo, métodos como Object.keys(), Object.getOwnPropertyDescriptor()e Array.isArray()são os recursos clássicos de reflexão.

ES6 introduz um novo objeto global chamado Reflectque permite chamar métodos, construir objetos, obter e definir propriedades e manipular e estender propriedades.

A ReflectAPI é importante porque permite desenvolver programas e frameworks capazes de lidar com código dinâmico.

Refletir API

Ao contrário da maioria dos objetos globais, o Reflectnão é um construtor. Isso significa que você não pode usar Reflectcom o newoperador ou invocar Reflectcomo uma função. É semelhante aos objetos Mathe JSON. Todos os métodos do Reflectobjeto são estáticos.

  • Reflect.apply()– chama uma função com argumentos especificados.
  • Reflect.construct()– agir como o newoperador, mas como uma função. É equivalente a chamar new target(...args).
  • Reflect.defineProperty()– é semelhante a Object.defineProperty(), mas retorna um valor booleano que indica se a propriedade foi ou não definida com sucesso no objeto.
  • Reflect.deleteProperty()– comporte-se como o deleteoperador, mas como uma função. É equivalente a chamar o  delete objectName[propertyName].
  • Reflect.get()– retornar o valor de uma propriedade.
  • Reflect.getOwnPropertyDescriptor()– é similar a Object.getOwnPropertyDescriptor(). Ele retorna um descritor de propriedade de uma propriedade se a propriedade existir no objeto ou undefinednão.
  • Reflect.getPrototypeOf()– é o mesmo que Object.getPrototypeOf().
  • Reflect.has()– funciona como o inoperador, mas como uma função. Ele retorna um booleano que indica se existe uma propriedade (própria ou herdada).
    Reflect.isExtensible()– é o mesmo que Object.isExtensible().
  • Reflect.ownKeys()– retorna uma matriz de chaves de propriedade pertencentes (não herdadas) de um objeto.
  • Reflect.preventExtensions()– é similar a Object.preventExtensions(). Ele retorna um booleano.
  • Reflect.set()– atribui um valor a uma propriedade e retorna um valor booleano que é verdadeiro se a propriedade for definida com sucesso.
  • Reflect.setPrototypeOf()– definir o protótipo de um objeto.

Vejamos alguns exemplos de uso da API Reflect:

Criando objetos: Reflect.construct()

O Reflect.construct()método se comporta como o newoperador, mas como uma função. É equivalente a chamar the new target(...args)com a possibilidade de especificar um protótipo diferente:

Reflect.construct(target, args [, newTarget])
Linguagem de código:  CSS  ( css )

O Reflect.construct()retorna a nova instância do target, ou newTargetse especificado, inicializado pelo targetcomo um construtor com os argumentos de objeto semelhantes a array fornecidos. Veja o exemplo a seguir:

class Person {
    constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    get fullName() {
        return `${this.firstName} ${this.lastName}`;
    }
};

let args = ['John', 'Doe'];

let john = Reflect.construct(
    Person,
    args
);

console.log(john instanceof Person);
console.log(john.fullName); // John Doe
Linguagem de código:  JavaScript  ( javascript )

Saída

true
John Doe
Linguagem de código:  JavaScript  ( javascript )

Neste exemplo:

  • Primeiro, defina uma classe chamada Person.
  • Segundo, declare um argsarray que contém duas strings.
  • Terceiro, crie uma nova instância da Personclasse usando o Reflect.construct()método. O johnobjeto é uma instância da Personclasse, portanto possui a fullNamepropriedade.

Chamando uma função:Reflect.apply()

Antes do ES6, você chamava uma função com um thisvalor especificado e argumentsusando o Function.prototype.apply()método. Por exemplo:

let result = Function.prototype.apply.call(Math.max, Math, [10, 20, 30]);
console.log(result);
Linguagem de código:  JavaScript  ( javascript )

Saída:

30

Esta sintaxe é bastante detalhada.

O Reflect.apply()fornece os mesmos recursos que o Function.prototype.apply(), mas menos detalhado e mais fácil de entender:

let result = Reflect.apply(Math.max, Math, [10, 20, 30]);
console.log(result);
Linguagem de código:  JavaScript  ( javascript )

Aqui está a sintaxe do Reflect.apply()método:

Reflect.apply(target, thisArg, args)
Linguagem de código:  JavaScript  ( javascript )

Definindo uma propriedade:Reflect.defineProperty()

O Reflect.defineProperty()é como o Object.defineProperty(). No entanto, ele retorna um booleano indicando se a propriedade foi definida com sucesso ou não, em vez de lançar uma exceção:

Reflect.defineProperty(target, propertyName, propertyDescriptor)
Linguagem de código:  JavaScript  ( javascript )

Veja o exemplo a seguir:

let person = {
    name: 'John Doe'
};

if (Reflect.defineProperty(person, 'age', {
        writable: true,
        configurable: true,
        enumerable: false,
        value: 25,
    })) {
    console.log(person.age);
} else {
    console.log('Cannot define the age property on the person object.');

}Linguagem de código:  JavaScript  ( javascript )

Neste tutorial, você aprendeu sobre a reflexão JavaScript e a API Reflect, que contém vários métodos reflexivos.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *