// Properties cleared in the middle of a single function constructor. function foo(x, y) { this.f = 0; this.g = x + y; this.h = 2; } var called = false; var a = 0; var b = {valueOf: function() { Object.defineProperty(Object.prototype, 'g', {set: function() { called = true }}) }}; var c = new foo(a, b); assertEq(called, true); assertEq(c.g, undefined); // Properties cleared in the middle of a constructor callee. function foo2(x, y) { this.a = 0; this.b = 1; bar2.call(this, x, y); this.c = 2; } function bar2(x, y) { this.d = x + y; this.e = 3; } var called2 = false; var xa = 0; var xb = {valueOf: function() { Object.defineProperty(Object.prototype, 'e', {set: function() { called2 = true }}) }}; var xc = new foo2(xa, xb); assertEq(called2, true); assertEq(xc.e, undefined); assertEq(xc.c, 2); // Properties cleared after a constructor callee. function foo3() { this.aa = 0; this.bb = 1; bar3.call(this); this.cc = 2; baz(); xbar3.call(this); this.dd = 3; } function bar3() { this.ee = 4; } function xbar3() { this.ff = 5; } function baz() { eval("xbar3.call = function() { called3 = true }"); } var called3 = false; var c3 = new foo3(); assertEq(c3.cc, 2); assertEq(c3.ee, 4); assertEq(c3.ff, undefined); assertEq(c3.dd, 3); assertEq(called3, true);