JSFiddle - React, Tailwind, and code Playground

by btipling

JavaScript

var Stack = (function() {

    var privilegedInstanceMethods = {
        push: function(x) {
            this.apply(Array.prototype.push, x);
        },
        pop: function() {
            return this.apply(Array.prototype.pop);
        },
        size: function() {
            return this.apply(function () { return this.length; });
        },
        empty: function() {
            return this.apply(function () { this.length = 0; });
        },
    };
    
    function createPrivateVar(instance, proto) {
        return Object.create(proto, {
            apply: {
                value: function(f) {
                   var r = [], i;
                   for (i = 1; i < arguments.length; i++) {
                     r[i-1] = arguments[i];
                   }
                   return f.apply(instance, r);
                },
            },
            print: {
                value: function () {
                    console.log(instance);
                }
            }
        });
    }

    var Stack = function () {
        this.arr = createPrivateVar([], privilegedInstanceMethods);
    };
    return Stack;

}());

// works
var s1 = new Stack();
var s2 = new Stack();
s1.arr.push("s1a");
s1.arr.push("s1b");
s2.arr.push("s2a");
s2.arr.push("s2b");

s1.arr.print();
s2.arr.print();

console.log(s1.arr.pop()); // "s1b"
console.log(s1.arr.pop()); // "s1a"
console.log(s2.arr.pop()); // "s2b"
console.log(s2.arr.pop()); // "s1a"
console.log(s1.arr.pop()); // null