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 Reflect
que permite chamar métodos, construir objetos, obter e definir propriedades e manipular e estender propriedades.
A Reflect
API é 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 Reflect
não é um construtor. Isso significa que você não pode usar Reflect
com o new
operador ou invocar Reflect
como uma função. É semelhante aos objetos Math
e JSON
. Todos os métodos do Reflect
objeto são estáticos.
Reflect.apply()
– chama uma função com argumentos especificados.Reflect.construct()
– agir como onew
operador, mas como uma função. É equivalente a chamarnew target(...args)
.Reflect.defineProperty()
– é semelhante aObject.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 odelete
operador, mas como uma função. É equivalente a chamar odelete objectName[propertyName]
.Reflect.get()
– retornar o valor de uma propriedade.Reflect.getOwnPropertyDescriptor()
– é similar aObject.getOwnPropertyDescriptor()
. Ele retorna um descritor de propriedade de uma propriedade se a propriedade existir no objeto ouundefined
não.Reflect.getPrototypeOf()
– é o mesmo queObject.getPrototypeOf()
.Reflect.has()
– funciona como oin
operador, mas como uma função. Ele retorna um booleano que indica se existe uma propriedade (própria ou herdada).Reflect.isExtensible()
– é o mesmo queObject.isExtensible()
.Reflect.ownKeys()
– retorna uma matriz de chaves de propriedade pertencentes (não herdadas) de um objeto.Reflect.preventExtensions()
– é similar aObject.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 new
operador, 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 newTarget
se especificado, inicializado pelo target
como 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
args
array que contém duas strings. - Terceiro, crie uma nova instância da
Person
classe usando oReflect.construct()
método. Ojohn
objeto é uma instância daPerson
classe, portanto possui afullName
propriedade.
Chamando uma função:Reflect.apply()
Antes do ES6, você chamava uma função com um this
valor especificado e arguments
usando 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.