michael@0: // Array.of calls a "length" setter if one is present. michael@0: michael@0: var hits = 0; michael@0: var lastObj = null, lastVal = undefined; michael@0: function setter(v) { michael@0: hits++; michael@0: lastObj = this; michael@0: lastVal = v; michael@0: } michael@0: michael@0: // when the setter is on the new object michael@0: function Pack() { michael@0: Object.defineProperty(this, "length", {set: setter}); michael@0: } michael@0: Pack.of = Array.of; michael@0: var pack = Pack.of("wolves", "cards", "cigarettes", "lies"); michael@0: assertEq(lastObj, pack); michael@0: assertEq(lastVal, 4); michael@0: michael@0: // when the setter is on the new object's prototype michael@0: function Bevy() {} michael@0: Object.defineProperty(Bevy.prototype, "length", {set: setter}); michael@0: Bevy.of = Array.of; michael@0: var bevy = Bevy.of("quail"); michael@0: assertEq(lastObj, bevy); michael@0: assertEq(lastVal, 1);