Proxy Made With Reflect 4 Top Now
function validateForm(schema, initialData)
return new Proxy(initialData,
set(target, prop, value, receiver)
if (schema[prop] && !schema[prop](value))
throw new Error(`Invalid value for $prop`);
return Reflect.set(target, prop, value, receiver);
);
const target = public: "visible", _private: "hidden" ;const handler = has(obj, prop) if (prop.startsWith("_")) return false; // pretend property doesn't exist return Reflect.has(obj, prop); ;
const proxy = new Proxy(target, handler); console.log("public" in proxy); // true console.log("_private" in proxy); // false
function createSecureProxy(resource, permissions, userRole) const hasPermission = (operation, prop) => const requiredRole = permissions[operation]?.[prop]; return !requiredRole ;const proxy, revoke = Proxy.revocable(resource, get(target, prop, receiver) if (!hasPermission("read", prop)) throw new Error(
Access denied: cannot read "$prop"); const value = Reflect.get(target, prop, receiver); // Bind functions to the original target to preservethisif (typeof value === "function") return value.bind(target); return value; , set(target, prop, value, receiver) if (!hasPermission("write", prop)) throw new Error(Access denied: cannot write to "$prop"); return Reflect.set(target, prop, value, receiver); , deleteProperty(target, prop) if (!hasPermission("delete", prop)) throw new Error(Access denied: cannot delete "$prop"); return Reflect.deleteProperty(target, prop); );return proxy, revoke ;
// Usage const sensitiveData = adminKey: "1234", publicName: "Dashboard" ; const permissions = read: adminKey: "admin", publicName: "user" , write: publicName: "admin" // Only admin can write publicName ;
const userSession = createSecureProxy(sensitiveData, permissions, "user"); console.log(userSession.proxy.publicName); // "Dashboard" // console.log(userSession.proxy.adminKey); // Throws Error userSession.proxy.publicName = "New Name"; // Works (user can write? No, wait — check write rule) // In this config, "user" cannot write publicName — would throw error. proxy made with reflect 4 top
// Later, revoke all access userSession.revoke(); // userSession.proxy.publicName; // Throws TypeError: proxy revoked
In the ever-evolving landscape of JavaScript, the ability to intercept and redefine fundamental operations of objects is a game-changer. This power comes from the Proxy object. However, using Proxy alone can be verbose and error-prone. Enter Reflect—a built-in object that provides methods for interceptable JavaScript operations. When combined correctly, Proxy and Reflect form a symbiotic pair that allows developers to create clean, maintainable, and powerful abstractions.
This article explores the "Proxy made with Reflect" philosophy. We will dissect four top-tier approaches to building proxies that leverage Reflect for default behavior, ensuring that you only override what you need while maintaining the integrity of native JavaScript operations. const target = public: "visible", _private: "hidden" ;