96% faster Javascript solution with comments. Please let me know if I can clarify more
\n\nvar MinStack = function() {\n  this.storage = [];\n};\n\n/** \n * @param {number} val\n * @return {void}\n */\nMinStack.prototype.push = function(val) {\n  
```\n\nvar MinStack = function() {\n  this.storage = [];\n};\n\n/** \n * @param {number} val\n * @return {void}\n */\nMinStack.prototype.push = function(val) {\n  // push an object containing the value and current min with this new val added\n  this.storage.push({\n    value: val,\n    // if we\'re pushing into an empty stack then our min val would be this val we\'re pushing\n    // if we pushed into a non empty stack then we would assign the Math.min of the val we\'re pushing or the min value we assigned at the bottom most of our stack\n    min: !this.storage.length ? val : Math.min(val, this.getMin())\n  })\n};\n\n/**\n * @return {void}\n */\nMinStack.prototype.pop = function() {\n  // currently our stack is implemented in reverse order so our top of stack is  at the bottom so we can pop from the end which is technically our top\n  this.storage.pop();\n};\n\n/**\n * @return {number}\n */\nMinStack.prototype.top = function() {\n  // since our stack is reverse ordered returning the end of our stack is actually our top\n  return this.storage[this.storage.length - 1].value;\n};\n\n/**\n * @return {number}\n */\nMinStack.prototype.getMin = function() {\n  // since our stack is reverse ordered the min of our stack would be the min value we assigned to this el when we called our push method\n  return this.storage[this.storage.length - 1].min;\n};\n\n\n/** \n * Your MinStack object will be instantiated and called as such:\n * var obj = new MinStack()\n * obj.push(val)\n * obj.pop()\n * var param_3 = obj.top()\n * var param_4 = obj.getMin()\n */\n ```
['JavaScript']