"use strict"; class Base { get test() { // This is incorrect according to the spec, // but close enough for loose. expect(this).toBe(Base.prototype); return function(...args) { expect(this).toBe(obj); expect(args).toEqual([1, 2, 3]); return 1; }; } } class Obj extends Base { call() { super.test(1, 2, 3); super.test(1, ...[2, 3]); super.test(...[1, 2, 3]); return super.test(...arguments); } } Object.defineProperty(Obj.prototype, 'test', { writable: true, configurable: true, value() { throw new Error("called"); } }); const obj = new Obj(); expect(obj.call(1, 2, 3)).toBe(1);