function shouldBe(actual, expected) { if (actual !== expected) throw new Error('bad value: ' + actual); } for (var i = 0; i < 10; ++i) { Object.defineProperty(Array.prototype, i, { get() { throw new Error('get is called.'); }, set(value) { throw new Error('set is called.'); } }); } class ArrayLike { constructor(length) { this.lengthCalled = false; this._length = length; } set length(value) { this.lengthCalled = true; this._length = value; } get length() { return this._length; } } var arrayLike = new ArrayLike(10); for (var i = 0; i < 10; ++i) { arrayLike[i] = i; } shouldBe(arrayLike.lengthCalled, false); var generated = Array.from.call(ArrayLike, arrayLike); shouldBe(generated.length, 10); shouldBe(generated instanceof ArrayLike, true); for (var i = 0; i < 10; ++i) { shouldBe(generated[i], i); } shouldBe(arrayLike.lengthCalled, false); shouldBe(generated.lengthCalled, true);