What are Proxies in JavaScript?

What are Proxies in JavaScript?

Among the plethora of features that JavaScript has to offer, the Proxy object is a unique and powerful tool that allows you to intercept and redefine fundamental operations for objects. This high-level feature is not just an addition to the language; it can fundamentally change how JavaScript works. In this blog post on codedamn, we will delve into the world of Proxies in JavaScript.

Understanding Proxies

Proxies provide a way to customize behavior that is normally fixed for objects. They do this by creating a wrapper around an object and defining behaviors on that wrapper. These behaviors are defined through a handler object, which specifies methods called traps that redefine how operations function on the object.

Let's start with a basic example:

let handler = { get: function(target, name) { return name in target ? target[name] : 42; } }; let p = new Proxy({}, handler); p.a = 1; console.log(p.a, p.b); // 1, 42

In this example, the handler has a get trap that redefines how property access works on the object. If the property exists on the object, it returns the property value; otherwise, it returns 42.

Constructing a Proxy

A Proxy is created with two parameters: target and handler. The target is the object which the proxy virtualizes. It can be any sort of object, including native arrays, functions, and even other proxies. The handler is an object that defines the custom behavior of the proxy. It is a collection of traps that you can think of as hooks into operations on the object.

let target = {}; let handler = {}; let proxy = new Proxy(target, handler);

Proxy Traps

Traps are the heart of proxies. They are the methods that provide property access. Here is a list of some common ones:

  • get(target, property, receiver): This trap is called when a property is read.
  • set(target, property, value, receiver): This trap is called when a property is set.
  • has(target, property): This trap is called by the in operator.
  • deleteProperty(target, property): This trap is called when a property is deleted.
  • apply(target, thisArg, argumentsList): This trap is called when a function is called.
  • construct(target, argumentsList): This trap is called when a function is used as a constructor.

These traps cover nearly every operation you can perform on an object, and by defining these in the handler, you can control how the object behaves.

Use Cases for Proxies

Proxies are extremely powerful and can be used in many situations. Here are a few common uses:

  1. Data validation: Proxies can be used to validate data before it is written to an object.

    let validator = { set: function(obj, prop, value) { if (prop === 'age') { if (!Number.isInteger(value)) { throw new TypeError('The age is not an integer'); } if (value > 200) { throw new RangeError('The age seems invalid'); } } // The default behavior to store the value obj[prop] = value; // Indicate success return true; } }; let person = new Proxy({}, validator); person.age = 100; console.log(person.age); // 100 person.age = 'young'; // Throws an exception person.age = 300; // Throws an exception
  2. Debugging: Proxies can be used to trace property accesses and changes.
  3. Performance measurements: Proxies are useful for measuring the performance of certain operations.
  4. Auto-populating object properties: With proxies, you can create objects that auto-populate their properties when accessed.


Q: Are there any performance implications when using Proxies?

A: Yes, there can be. Proxies add an extra layer of abstraction which can lead to performance penalties. However, modern engines are optimized to minimize these penalties.

Q: Can I use Proxies with built-in objects like Arrays or Maps?

A: Absolutely! Proxies can wrap any object, including built-in objects.

Q: Can I use Proxies to intercept function calls?

A: Yes, you can. The apply and construct traps are used to intercept function calls and constructor calls, respectively.

Q: Can I wrap a Proxy around another Proxy?

A: Yes. Proxies can wrap other proxies, creating a chain of proxies.

For further understanding, you can refer to the official documentation of JavaScript Proxies.

In conclusion, JavaScript Proxies are a powerful feature that can be used to customize behavior that is normally fixed for objects. They open up a world of possibilities and enable you to write more dynamic and flexible code. However, they should be used judiciously, as they can also introduce complexity and performance implications. So, use them wisely and make the most out of this advanced feature.

Sharing is caring

Did you like what Sarthak Jain wrote? Thank them for their work by sharing it on social media.


No comments so far