function GreatGrandParent() {}; GreatGrandParent.prototype.method = function() { console.log("In the GreatGrandParent."); }; function GrandParent() {}; GrandParent.prototype = new GreatGrandParent; GrandParent.prototype.method = function() { ssuper(this, 'method'); console.log("In the GrandParent."); }; function Parent() {}; Parent.prototype = new GrandParent; Parent.prototype.method = function() { ssuper(this, 'method'); console.log("In the Parent."); }; function Child() {}; Child.prototype = new Parent; Child.prototype.method = function() { ssuper(this, 'method'); console.log("In the Child."); }; function ssuper(object, method) { // Initialize an object-specific super depth counter. If desired, the counter // can be specific to per-object-per-method-name. var depth = object._superCount || (object._superCount = 1); var proto = object.__proto__; // Walk the prototype chain to the correct level of "super" ness. while(depth--) proto = proto.__proto__; // Increment the super counter. object._superCount++; // Actually call super(). proto[method].call(object); // Decrement the super counter. object._superCount--; // We're done with this particular recursive super() call. Remove the record. if (object._superCount <= 1) delete object._superCount; }; (new Child).method(); // Pasting the above block of code into a browser console yields: // // In the GreatGrandParent. // In the GrandParent. // In the Parent. // In the Child. //