我正在尝试动态地将回调分配给我的对象,我似乎无法找到一种方法来执行此操作,同时授予此函数访问私有变量的权限。我已经列出了下面的相关代码以及我遇到墙壁的评论。
function makeObj ( o ) {
function F() {}
F.prototype = o;
return new F();
}
var MODULE = (function(){
var myMod = {},
privateVar = "I'm private";
return myMod;
})();
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();
在这次尝试中,我尝试在模块对象中制作一个setter ......但无济于事。
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();
我刚刚使用JavaScript错了吗?我真的希望能够在启动对象后分配回调。这可能吗?
答案 0 :(得分:2)
您无法通过动态回调函数设置访问私有变量(因为如果稍后附加它,它不能是闭包),但您可以设置一个系统,通过该系统可以访问变量:
var MODULE = (function(){
var myMod = {},
privateVar = "I'm private";
myMod.callback = function(fn) {fn(privateVar);};
return myMod;
})();
var someDynamicFunc = function(param) {alert(param);};
myMod.callback(someDynamicFunc);
当然,这使得它不是真正私密的,因为任何人都可以做到这一点。我不知道你怎么可能有一个你通过动态附加函数访问的“私有”变量,而不允许任何其他人的动态附加函数具有相同的权限(从而使它不是真正的私有)。
答案 1 :(得分:1)
我猜你并没有真正理解闭包是如何工作的。
闭包意味着范围始终可以访问定义的外部范围。
function Counter(start) {
var count = start;
return {
increment: function() { // has access to the outer scope
count++;
},
get: function() {
return count;
}
}
}
var foo = new Counter(4);
foo.increment();
foo.get(); // 5
上面的示例返回两个闭包,函数increment
和get
都保留对构造函数中定义的count
变量的引用。< / p>
一个无法从外部访问count
,与之互动的唯一方式是通过两个“关闭”功能。
请记住,闭包通过保留对其外部作用域的引用来工作,因此以下不工作:
var foo = new Counter(4);
foo.hack = function() { // is not getting defined in the same scope that the original count was
count = 1337;
};
这将不更改count
内的变量Counter
,因为foo.hack
在该范围内未定义,而是,它将创建或覆盖全局变量count
。