function assert(a) { if (!a) throw new Error("Bad Assertion!"); } class A { constructor(prop) { this.prop = prop; } call() { return this.prop; } apply() { return this.prop; } } class B extends A { testSuper() { assert(super.call() == 'value'); assert(super.apply() == 'value'); } } const obj = new B('value') obj.testSuper() class C {} class D extends C { testSuper() { try { super.call(); assert(false); } catch(e) { assert(e.message == "super.call is not a function. (In 'super.call()', 'super.call' is undefined)"); } try { super.apply(); assert(false); } catch(e) { assert(e.message == "super.apply is not a function. (In 'super.apply()', 'super.apply' is undefined)"); } } } let d = new D(); d.testSuper();