JSFiddle - React, Tailwind, and code Playground

by btipling

JavaScript

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() {

    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; });
        },
    };

    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