Proxy.handler-construct.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. describe("[[Construct]] trap normal behavior", () => {
  2. test("forwarding when not defined in handler", () => {
  3. let p = new Proxy(function() { this.x = 5; }, { construct: null });
  4. expect((new p).x).toBe(5);
  5. p = new Proxy(function() { this.x = 5; }, { construct: undefined });
  6. expect((new p).x).toBe(5);
  7. p = new Proxy(function() { this.x = 5; }, {});
  8. expect((new p).x).toBe(5);
  9. });
  10. test("trapping 'new'", () => {
  11. function f(value) {
  12. this.x = value;
  13. }
  14. let p;
  15. const handler = {
  16. construct(target, arguments, newTarget) {
  17. expect(target).toBe(f);
  18. expect(newTarget).toBe(p);
  19. if (arguments[1])
  20. return Reflect.construct(target, [arguments[0] * 2], newTarget);
  21. return Reflect.construct(target, arguments, newTarget);
  22. },
  23. };
  24. p = new Proxy(f, handler);
  25. expect(new p(15).x).toBe(15);
  26. expect(new p(15, true).x).toBe(30);
  27. });
  28. test("trapping Reflect.construct", () => {
  29. function f(value) {
  30. this.x = value;
  31. }
  32. let p;
  33. function theNewTarget() {};
  34. const handler = {
  35. construct(target, arguments, newTarget) {
  36. expect(target).toBe(f);
  37. expect(newTarget).toBe(theNewTarget);
  38. if (arguments[1])
  39. return Reflect.construct(target, [arguments[0] * 2], newTarget);
  40. return Reflect.construct(target, arguments, newTarget);
  41. },
  42. };
  43. p = new Proxy(f, handler);
  44. Reflect.construct(p, [15], theNewTarget);
  45. });
  46. });
  47. describe("[[Construct]] invariants", () => {
  48. test("target must have a [[Construct]] slot", () => {
  49. [{}, [], new Proxy({}, {})].forEach(item => {
  50. expect(() => {
  51. new (new Proxy(item, {}));
  52. }).toThrowWithMessage(TypeError, "[object ProxyObject] is not a constructor");
  53. });
  54. });
  55. });