How to create private variable in a javascript class

Private variables aren't really available on javascript classes, at least not last time I checked (June 2020). And you really probably shouldn't do this, because it's extremely hacky, uses eval in runtime code, and uhh... That's bad, right?

Anyway, it seemed like a lot of fun to figure out, so I did! And this is what we have.

It's been awhile since I made this, so it's possible the private variables don't work across different functions of the class... But I think they do?

The Test Class


class Expose {

    //prefix the function with N_ to specify that we want to use private variables
    // the function using the private field will be renamed without the prefix
    static N_a(aparam,paramTwo){
        alert(aparam);
        alert(paramTwo)
        //make sure we stay in the class
        alert(this.verify);
        //these next two will be private.
        alert(privateField);
        alert(privTwo);
    }
    static change(key,func){
        this[key] = func;
    }
}
Expose.verify = "cats";

The function to create private fields

function exposeVar(obj,key,bindArgs){
    const exposeVar = function(obj,key,bindArgs){
            const slicedArgs = Array.prototype.slice.call(arguments,3);
            const func = obj['N_'+key];
            // const theValue = privateValue;
            for (const bindKey in bindArgs){
                eval('var '+bindKey+'= bindArgs[bindKey];');
            }
            const g = "(function "+func.toString()+").apply(this,slicedArgs)();";
            alert(g);
            eval(g);
        }.bind(obj,obj,key,bindArgs);
    obj[key] = exposeVar;
    return exposeVar;
}

Using the private field creator

// add privateField & privTwo to the 'a' function.
const exposedFunc = exposeVar(Expose,'a',{'privateField':'first private field','privTwo': "Another pviate field"});
Expose.a('got that bound',"another paramater");
//basically, do exposeVar() for every method of the class (or prototype) that starts with N_