I’m trying to assign a callback dynamically to an Object of mine, I can’t seem to figure out a way to do this while granting this function access to private variables. I’ve listed the relavant code below with comments where I ran into walls.
Object Factory
function makeObj ( o ) {
function F() {}
F.prototype = o;
return new F();
}
Module
var MODULE = (function(){
var myMod = {},
privateVar = "I'm private";
return myMod;
})();
Various Attempts
myMod.someDynamicFunc = function someDynamicFunc(){
//privateVar === undefined;
alert( privateVar );
}
myMod.someDynamicFunc();
myMod.prototype.someDynamicFunc = function someDynamicFunc(){
//ERROR: Cannot set property 'someDynamicFunc' of undefined
alert(privateVar);
}
myMod.someDynamicFunc();
In this attempt I tried making a setter in the module object… to no avail.
var MODULE = (function(){
var myMod = {},
privateVar = "I'm private";
myMod.setDynamicFunction = function ( func ){
if(func !== undefined && typeof func === "function"){
//Uncaught TypeError:
// Cannot read property 'dynamicFunction' of undefined
myMod.prototype.dynamicFunction = func;
//also tried myMod.dynamicFunction = func;
}
}
return myMod;
})();
var myModule = makeObject( MODULE );
myModule.setDynamicFunction(function(){
alert(privateVar);
});
myModule.dynamicFunction();
Am I just using JavaScript wrong? I’d really like to be able to assign callbacks after the object is initiated. Is this possible?
You can’t access the private variable via a callback function set dynamically (since it can’t be a closure if it’s attached later), but you can set up a system by which you would be able to access the variable:
Of course, this makes it not really private, since anyone could do this. I don’t see how it would be possible at all for you to have a “private” variable that you access via dynamically attached functions, without allowing anyone else’s dynamically attached functions to have the same privilege (thus making it not really private).