Object.defineProperty.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. load("test-common.js");
  2. try {
  3. var o = {};
  4. Object.defineProperty(o, "foo", { value: 1, writable: false, enumerable: false });
  5. assert(o.foo === 1);
  6. o.foo = 2;
  7. assert(o.foo === 1);
  8. Object.defineProperty(o, 2, { get() { return 10; } });
  9. assert(o[2] === 10);
  10. var d = Object.getOwnPropertyDescriptor(o, "foo");
  11. assert(d.configurable === false);
  12. assert(d.enumerable === false);
  13. assert(d.writable === false);
  14. assert(d.value === 1);
  15. Object.defineProperty(o, "bar", { value: "hi", writable: true, enumerable: true });
  16. assert(o.bar === "hi");
  17. o.bar = "ho";
  18. assert(o.bar === "ho");
  19. d = Object.getOwnPropertyDescriptor(o, "bar");
  20. assert(d.configurable === false);
  21. assert(d.enumerable === true);
  22. assert(d.writable === true);
  23. assert(d.value === "ho");
  24. assertThrowsError(() => {
  25. Object.defineProperty(o, "bar", { value: "xx", enumerable: false });
  26. }, {
  27. error: TypeError
  28. });
  29. Object.defineProperty(o, "baz", { value: 9, configurable: true, writable: false });
  30. Object.defineProperty(o, "baz", { configurable: true, writable: true });
  31. d = Object.getOwnPropertyDescriptor(o, "baz");
  32. assert(d.configurable === true);
  33. assert(d.writable === true);
  34. assert(d.value === 9);
  35. Object.defineProperty(o, "qux", {
  36. configurable: true,
  37. get() {
  38. return o.secret_qux + 1;
  39. },
  40. set(value) {
  41. this.secret_qux = value + 1;
  42. },
  43. });
  44. o.qux = 10;
  45. assert(o.qux === 12);
  46. o.qux = 20;
  47. assert(o.qux = 22);
  48. Object.defineProperty(o, "qux", { configurable: true, value: 4 });
  49. assert(o.qux === 4);
  50. o.qux = 5;
  51. assert(o.qux = 4);
  52. Object.defineProperty(o, "qux", {
  53. configurable: false,
  54. get() {
  55. return this.secret_qux + 2;
  56. },
  57. set(value) {
  58. o.secret_qux = value + 2;
  59. },
  60. });
  61. o.qux = 10;
  62. assert(o.qux === 14);
  63. o.qux = 20;
  64. assert(o.qux = 24);
  65. assertThrowsError(() => {
  66. Object.defineProperty(o, "qux", {
  67. configurable: false,
  68. get() {
  69. return this.secret_qux + 2;
  70. },
  71. });
  72. }, {
  73. error: TypeError,
  74. message: "Cannot change attributes of non-configurable property 'qux'",
  75. });
  76. assertThrowsError(() => {
  77. Object.defineProperty(o, "qux", { value: 2 });
  78. }, {
  79. error: TypeError,
  80. message: "Cannot change attributes of non-configurable property 'qux'",
  81. });
  82. assertThrowsError(() => {
  83. Object.defineProperty(o, "a", {
  84. get() {},
  85. value: 9,
  86. });
  87. }, {
  88. error: TypeError,
  89. message: "Accessor property descriptor cannot specify a value or writable key",
  90. });
  91. assertThrowsError(() => {
  92. Object.defineProperty(o, "a", {
  93. set() {},
  94. writable: true,
  95. });
  96. }, {
  97. error: TypeError,
  98. message: "Accessor property descriptor cannot specify a value or writable key",
  99. });
  100. console.log("PASS");
  101. } catch (e) {
  102. console.log(e)
  103. }