| // Define a test object |
| var test = {x:1,y:2}; |
| |
| // Put the object into dictionary mode by deleting |
| // a property that was not the last one added. |
| delete test.x; |
| |
| // Define a an accessor property with a setter that |
| // itself calls Object.defineProperty |
| Object.defineProperty(test, "foo", { |
| get: function() { return 1; }, |
| set: function(v) { |
| Object.defineProperty(this, "foo", { value: v }); |
| // Prints the correct object descriptor |
| assertEq(this.foo, 33); |
| }, |
| configurable: true |
| }); |
| |
| // Add another property, so generateOwnShape does not replace the foo property. |
| test.other = 0; |
| |
| // This line prints 1, as expected |
| assertEq(test.foo, 1); |
| |
| // Now set the property. This calls the setter method above. |
| // And the setter method prints the expected value and property descriptor. |
| test.foo = 33; |
| |
| // Finally read the newly set value. |
| assertEq(test.foo, 33); |
| |
| // Check that enumeration order is correct. |
| var arr = []; |
| for (var x in test) arr.push(x); |
| assertEq("" + arr, "y,other"); |