CodeBlanks Logo Icon CodeBlanks

Challenge - Validation with Proxy

JavaScript course · Expert · Lesson 61/63

Build a wrapper that validates a settings object's properties with Proxy and Reflect.

Validation with Proxy

In this challenge you will build a validation wrapper that protects a settings object. new Proxy(target, handler) gives indirect access to a target; the traps in handler intercept each operation.

The set trap runs when a property is assigned. Its signature is (target, key, value, receiver). For an invalid value you throw; for a valid one you call Reflect.set(target, key, value, receiver) and return the true it yields.

Reflect mirrors the Proxy trap signatures so you can reproduce the default behavior easily.

Exercise Write a validating Proxy

Write a handler object whose set trap has the signature (target, key, value, receiver). If value is not a number, throw new TypeError('number required'). For valid values call Reflect.set(target, key, value, receiver) and return its result. Finally wrap a settings object with new Proxy(settings, handler).

Show example solution
Write const handler = { set(target, key, value, receiver) { if (typeof value !== 'number') throw new TypeError('number required'); return Reflect.set(target, key, value, receiver); } };. Then wrap with const proxy = new Proxy(settings, handler);.

Example solution:
const handler = {
  set(target, key, value, receiver) {
    if (typeof value !== 'number') throw new TypeError('number required');
    return Reflect.set(target, key, value, receiver);
  }
};

const settings = {};
const proxy = new Proxy(settings, handler);

Test yourself

  1. What does Reflect.set return?

    const ok = Reflect.set(target, key, value, receiver);
    • The assigned value
    • The target object
    • A success boolean
    • Nothing (undefined)
    Show answer

    A success boolean — Correct! Reflect.set returns true on success and false on failure; you pass it back from the trap.

  2. Complete the set trap signature

    const handler = {
      set(target, key, value, ____) {
        if (typeof value !== 'number') throw new TypeError('number required');
        return Reflect.set(target, key, value, receiver);
      }
    };
    Show answer
    const handler = {
      set(target, key, value, receiver) {
        if (typeof value !== 'number') throw new TypeError('number required');
        return Reflect.set(target, key, value, receiver);
      }
    };
  3. Match the Proxy concepts

    new Proxy(t, h)
    Create wrapper
    set trap
    Catch assignment
    Reflect.set
    Default assign
    throw
    Invalid value

All lessons in Expert