Skip to content

Instantly share code, notes, and snippets.

@rkatic
Last active September 25, 2015 23:08
Show Gist options
  • Save rkatic/999707 to your computer and use it in GitHub Desktop.
Save rkatic/999707 to your computer and use it in GitHub Desktop.
Private members hack...
function Private() {
var val, NADA = {};
return {
open: function( safe, ret ) {
val = NADA;
safe();
if ( val !== NADA ) {
ret = val;
val = NADA;
}
return ret;
},
safe: function( value ) {
return function() {
val = value;
};
}
};
}
var WMap = this.WeakMap || (function(){
var expando_postfix = ":" + ( "" + Math.random() ).slice(2),
expando_counter = 0;
return function() {
var val,
expando = ++expando_counter + expando_postfix;
return {
get: function( obj, ret ) {
if ( expando in obj ) {
val = void 0;
obj[ expando ]();
if ( val && val.obj === obj ) {
ret = val.value;
}
val = void 0;
}
return ret;
},
set: function( obj, value ) {
var a = { obj: obj, value: value };
obj[ expando ] = function() {
val = a;
};
}
};
};
})();
var PrivateData = function() {
var map = WMap();
return function( obj ) {
var data = map.get( obj );
if ( !data ) {
data = {};
map.set( obj, data );
}
return data;
};
};
// EXAMPLE
var MyClass = (function(){
var PRIVATE = PrivateData();
function MyClass( pass, data ) {
var p = PRIVATE(this);
p.pass = pass;
p.data = data;
}
MyClass.prototype.acces = function( pass ) {
var priv = PRIVATE(this);
if ( priv.pass !== pass ) {
throw new Error("bad password");
}
return priv;
};
MyClass.prototype.changePass = function( oldPass, newPass ) {
this.acces( oldPass ).pass = newPass;
};
MyClass.prototype.setData = function( pass, data ) {
this.acces( pass ).data = data;
};
MyClass.prototype.getData = function( pass ) {
return this.acces( pass ).data;
};
return MyClass;
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment