Proxies

  • create a proxy
  1. var proxy = new Proxy({}, {
  2. get: function(target, property) {
  3. return 35;
  4. }
  5. });
  6. var handler = {
  7. // target.prop
  8. get: ...,
  9. // target.prop = value
  10. set: ...,
  11. // 'prop' in target
  12. has: ...,
  13. // delete target.prop
  14. deleteProperty: ...,
  15. // target(...args)
  16. apply: ...,
  17. // new target(...args)
  18. construct: ...,
  19. // Object.getOwnPropertyDescriptor(target, 'prop')
  20. getOwnPropertyDescriptor: ...,
  21. // Object.defineProperty(target, 'prop', descriptor)
  22. defineProperty: ...,
  23. // Object.getPrototypeOf(target), Reflect.getPrototypeOf(target),
  24. // target.__proto__, object.isPrototypeOf(target), object instanceof target
  25. getPrototypeOf: ...,
  26. // Object.setPrototypeOf(target), Reflect.setPrototypeOf(target)
  27. setPrototypeOf: ...,
  28. // for (let i in target) {}
  29. enumerate: ...,
  30. // Object.keys(target)
  31. ownKeys: ...,
  32. // Object.preventExtensions(target)
  33. preventExtensions: ...,
  34. // Object.isExtensible(target)
  35. isExtensible :...
  36. }
  37. console.log(proxy.time); // 35
  38. console.log(proxy.name); // 35
  39. console.log(proxy.title); // 35
  40. Array.isArray(new Proxy([], {})); // true

Uses

Defensive Objects

  1. function createDefensiveObject(target) {
  2. return new Proxy(target, {
  3. get: function(target, property) {
  4. if (property in target) {
  5. return target[property];
  6. } else {
  7. throw new ReferenceError(
  8. "Property \"" + property + "\" does not exist.");
  9. }
  10. }
  11. });
  12. }
  13. let person = {
  14. name: "Nicholas"
  15. };
  16. let defensivePerson = createDefensiveObject(person);
  17. console.log(defensivePerson.name); // "Nicholas"
  18. console.log(defensivePerson.age); // ReferenceError!

Type Safety

  1. function createTypeSafeObject(object) {
  2. return new Proxy(object, {
  3. set: function(target, property, value) {
  4. var currentType = typeof target[property],
  5. newType = typeof value;
  6. if (property in target && currentType !== newType) {
  7. throw new Error(
  8. "Property "
  9. + property
  10. + " must be a "
  11. + currentType + ".");
  12. } else {
  13. target[property] = value;
  14. }
  15. }
  16. });
  17. }

Ref