DEV Community

Cover image for What are Proxies in JavaScript
waelhabbal
waelhabbal

Posted on

What are Proxies in JavaScript

In JavaScript, a proxy is an object that acts as an intermediary between a target object and any code that interacts with the target object. A proxy can be used to intercept and manipulate the interactions between the target object and the code that uses it. Proxies are often used to provide additional functionality, validation, or logging capabilities to objects.

Types of Proxies in JavaScript

There are several types of proxies in JavaScript:

  1. Proxy Constructor: The Proxy constructor is used to create a new proxy object. It takes two arguments: the target object that the proxy will intercept and a handler object that defines the behavior of the proxy.
  2. Reflect: The Reflect object is a built-in object in JavaScript that provides methods for creating and working with proxies.

Creating a Proxy

To create a proxy in JavaScript, you need to use the Proxy constructor. Here is an example:

const target = {
  get Foo() {
    return "Hello";
  }
};

const handler = {
  get: (target, prop) => {
    if (prop === "Foo") {
      return "Hello World!";
    } else {
      return Reflect.get(target, prop);
    }
  }
};

const proxy = new Proxy(target, handler);

console.log(proxy.Foo); // Output: "Hello World!"
console.log(proxy.Bar); // Output: "undefined"
Enter fullscreen mode Exit fullscreen mode

In this example, we create a target object with a single property Foo that returns the string "Hello". We then create a handler object that intercepts property access on the target object. When the property Foo is accessed, the handler returns "Hello World!". If any other property is accessed, the handler simply calls Reflect.get to retrieve the value from the target object.

Real-World Scenarios for Using Proxies

Proxies can be used in a variety of real-world scenarios. Here are a few examples:

  1. Data Validation: You can use a proxy to validate data before it is stored or sent over the network. For example, you could create a proxy for an API endpoint that validates user input before sending it to the server.
const API = {
  postUser(user) {
    // validate user data
    if (!user.name || !user.email) {
      throw new Error("Invalid user data");
    }
    // send user data to server
  }
};

const validatedAPI = new Proxy(API, {
  apply: (target, thisArg, args) => {
    const [method, ...rest] = args;
    if (method === "postUser") {
      const validatedData = validate(rest[0]);
      return target[method](validatedData);
    } else {
      return target[method](...rest);
    }
  }
});

validatedAPI.postUser({ name: "", email: "" }); // Output: Error: Invalid user data
validatedAPI.postUser({ name: "John", email: "john@example.com" }); // Output: User created successfully
Enter fullscreen mode Exit fullscreen mode
  1. Caching: You can use a proxy to cache frequently accessed data to improve performance. For example, you could create a proxy for an API endpoint that caches responses for a certain amount of time.
const API = {
  getUser(id) {
    // fetch user data from server
  }
};

const cachedAPI = new Proxy(API, {
  get: (target, prop) => {
    if (prop === "getUser") {
      const cache = {};
      const cachedUser = cache[id];
      if (cachedUser) {
        return cachedUser;
      } else {
        const result = target[prop](id);
        cache[id] = result;
        return result;
      }
    } else {
      return Reflect.get(target, prop);
    }
  }
});

cachedAPI.getUser(1); // fetches user data from server
cachedAPI.getUser(1); // returns cached user data
Enter fullscreen mode Exit fullscreen mode
  1. Logging: You can use a proxy to log interactions with an object or function. For example, you could create a proxy for an API endpoint that logs requests and responses.
const API = {
  postUser(user) {
    // send user data to server
  }
};

const loggedAPI = new Proxy(API, {
  apply: (target, thisArg, args) => {
    console.log(`Request: ${args[0]}`);
    const result = target.apply(thisArg, args);
    console.log(`Response: ${result}`);
    return result;
  }
});

loggedAPI.postUser({ name: "John", email: "john@example.com" });
// Output:
// Request: postUser { name: "John", email: "john@example.com" }
// Response: User created successfully
Enter fullscreen mode Exit fullscreen mode

These are just a few examples of how you can use proxies in JavaScript. Proxies can be used in many other scenarios where you need to intercept and manipulate interactions with objects or functions.

Conclusion

Proxies are a powerful tool in JavaScript that can be used to provide additional functionality, validation, or logging capabilities to objects. By creating custom proxies using the Proxy constructor or using built-in proxies like Reflect, you can write more robust and maintainable code. I hope this post has provided a comprehensive introduction to proxies in JavaScript and has inspired you to explore their possibilities further!

References:

Top comments (0)