What is the use of the Reflect.set() method in JavaScript?

In JavaScript, the Reflect.set() method is used to set a property of an object to a specified value. It is part of the Reflect API, which provides a set of methods that allow you to manipulate objects and their properties in a more functional way.

The syntax for using the Reflect.set() method is as follows:

Reflect.set(target, propertyKey, value[, receiver])

Here, target is the object on which the property is being set, propertyKey is the name of the property being set, value is the value to be set, and receiver (optional) is the object that will be used as the this value when setting the property. If receiver is not provided, target is used as the this value.

Let’s take a closer look at each of these parameters and see how they are used in practice.

The target parameter:

The target parameter is the object on which the property is being set. This can be any object, including an array, a function, or even another object.

Here’s an example:

const obj = {};
Reflect.set(obj, "foo", "bar");
console.log(obj.foo); // 'bar'

In this example, we create an empty object obj and then use the Reflect.set() method to set the foo property to the value 'bar'. We then log the value of obj.foo to the console and see that it is indeed 'bar'.

The propertyKey parameter:

The propertyKey parameter is the name of the property being set. This can be a string or a symbol.

Here’s an example:

const obj = {};
const symbol = Symbol();
Reflect.set(obj, "foo", "bar");
Reflect.set(obj, symbol, "baz");
console.log(obj.foo); // 'bar'
console.log(obj[symbol]); // 'baz'

In this example, we create an empty object obj and a new symbol symbol. We then use the Reflect.set() method twice, once to set the foo property to 'bar' and once to set the symbol property to 'baz'. We then log the values of obj.foo and obj[symbol] to the console and see that they are 'bar' and 'baz', respectively.

The value parameter:

The value parameter is the value to be set for the specified property. This can be any JavaScript value, including a string, number, boolean, object, or function.

Here’s an example:

const obj = {};
const func = function () {
  console.log("Hello, world!");
};
Reflect.set(obj, "foo", 42);
Reflect.set(obj, "bar", true);
Reflect.set(obj, "baz", { a: 1, b: 2 });
Reflect.set(obj, "qux", func);
console.log(obj.foo); // 42
console.log(obj.bar); // true
console.log(obj.baz); // { a: 1, b: 2 }
console.log(obj.qux); // [Function: func]

In this example, we create an empty object obj and a new function func. We then use the Reflect.set() method four times, once to set the foo property to the number 42, once to set the bar property to the boolean true, once to set the baz property to an object with two properties a and b, and once to set the qux property to the function func. We then log the values of obj.foo, obj.bar, obj.baz, and obj.qux to the console and see that they are 42, true, { a: 1, b: 2 }, and function() { console.log('Hello, world!'); }, respectively.

The receiver parameter:

The receiver parameter is an optional parameter that specifies the object that will be used as the this value when setting the property. If receiver is not provided, target is used as the this value.

Here’s an example:

const obj1 = { foo: "bar" };
const obj2 = { baz: "qux" };
Reflect.set(obj1, "foo", "baz", obj2);
console.log(obj1.foo); // 'bar'
console.log(obj2.foo); // 'baz'

In this example, we create two objects obj1 and obj2. We then use the Reflect.set() method to set the foo property of obj1 to 'baz', but we specify obj2 as the receiver. We then log the values of obj1.foo and obj2.foo to the console and see that they are 'bar' and 'baz', respectively. This is because obj1 is used as the target object, but obj2 is used as the this value when setting the property.

Return value:

The Reflect.set() method returns a boolean indicating whether or not the property was successfully set. This is useful for checking if a property was set or not.

Here’s an example:

const obj = {};
const result = Reflect.set(obj, "foo", "bar");
console.log(result); // true

In this example, we create an empty object obj and use the Reflect.set() method to set the foo property to 'bar'. We then store the result of the method call in a variable result and log it to the console. Since the property was successfully set, the method returns true.

Using Reflect.set() with proxies:

One of the most powerful features of the Reflect API is its ability to work with JavaScript proxies. Proxies allow you to intercept and customize the behavior of object operations, including property access and modification. The Reflect.set() method can be used with proxies to intercept property assignments and customize their behavior.

Here’s an example:

const target = { foo: "bar" };
const handler = {
  set: function (target, property, value, receiver) {
    console.log(`Setting ${property} to ${value}`);
    return Reflect.set(target, property, value, receiver);
  },
};
const proxy = new Proxy(target, handler);
proxy.foo = "baz"; // logs "Setting foo to baz"
console.log(proxy.foo); // 'baz'

In this example, we create an object target with a single property foo set to 'bar'. We then create a proxy proxy that wraps around target and a handler object that intercepts property assignments. The set method of the handler logs a message to the console whenever a property is set, and then calls the Reflect.set() method to actually set the property. We then use the proxy to set the foo property to 'baz', which triggers the set method of the handler and logs the message to the console. Finally, we log the value of proxy.foo to the console and see that it is indeed 'baz'.

Thank you for reading, and let’s have conversation with each other

Thank you for reading my article. Let’s have conversation on Twitter and LinkedIn by connecting.

Read more: