Proxy.handler-set.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. load("test-common.js");
  2. try {
  3. assert((new Proxy({}, { set: undefined }).foo = 1) === 1);
  4. assert((new Proxy({}, { set: null }).foo = 1) === 1);
  5. assert((new Proxy({}, {}).foo = 1) === 1);
  6. let o = {};
  7. let p = new Proxy(o, {
  8. set(target, prop, value, receiver) {
  9. assert(target === o);
  10. assert(prop === "foo");
  11. assert(value === 10);
  12. assert(receiver === p);
  13. return true;
  14. },
  15. });
  16. p.foo = 10;
  17. p = new Proxy(o, {
  18. set(target, prop, value, receiver) {
  19. if (target[prop] === value) {
  20. target[prop] *= 2;
  21. } else {
  22. target[prop] = value;
  23. }
  24. },
  25. });
  26. p.foo = 10;
  27. assert(p.foo === 10);
  28. p.foo = 10;
  29. assert(p.foo === 20);
  30. p.foo = 10;
  31. assert(p.foo === 10);
  32. // Invariants
  33. o = {};
  34. Object.defineProperty(o, "foo", { value: 10 });
  35. p = new Proxy(o, {
  36. set() {
  37. return true;
  38. },
  39. });
  40. assertThrowsError(() => {
  41. p.foo = 12;
  42. }, {
  43. error: TypeError,
  44. message: "Proxy handler's set trap violates invariant: cannot return true for a property on the target which is a non-configurable, non-writable own data property",
  45. });
  46. Object.defineProperty(o, "bar", { get() {} });
  47. assertThrowsError(() => {
  48. p.bar = 12;
  49. }, {
  50. error: TypeError,
  51. message: "Proxy handler's set trap violates invariant: cannot return true for a property on the target which is a non-configurable own accessor property with an undefined set attribute",
  52. });
  53. console.log("PASS");
  54. } catch (e) {
  55. console.log("FAIL: " + e);
  56. }