Javascript 动态附加函数以授予对私有变量的访问权限

Javascript 动态附加函数以授予对私有变量的访问权限,javascript,inheritance,prototypal-inheritance,Javascript,Inheritance,Prototypal Inheritance,我试图动态地将回调分配给我的一个对象,在授予这个函数访问私有变量的权限时,我似乎找不到一种方法来实现这一点。我在下面列出了相关代码,以及我遇到墙的地方的注释 对象工厂 模块 各种尝试 在这次尝试中,我尝试在模块对象中创建一个setter。。。无济于事 var MODULE = (function(){ var myMod = {}, privateVar = "I'm private"; myMod.setDynamicFunct

我试图动态地将回调分配给我的一个对象,在授予这个函数访问私有变量的权限时,我似乎找不到一种方法来实现这一点。我在下面列出了相关代码,以及我遇到墙的地方的注释

对象工厂 模块 各种尝试


在这次尝试中,我尝试在模块对象中创建一个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吗?我真的希望能够在对象启动后分配回调。这是可能的吗?

您不能通过动态设置的回调函数访问私有变量(因为如果以后附加它,它就不能成为闭包),但您可以设置一个系统,通过该系统可以访问变量:

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

当然,这并不是真正的隐私,因为任何人都可以这样做。我不明白你怎么可能拥有一个通过动态附加函数访问的“私有”变量,而不允许任何其他动态附加函数拥有相同的特权(从而使它不是真正私有的)。

我猜你并不真正理解闭包是如何工作的

闭包意味着作用域始终可以访问它们在中定义的外部作用域

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
变量的引用

一个无法从外部访问
count
,与之交互的唯一方式是通过两个“closured”函数

请记住,闭包通过保持对其外部作用域的引用来工作,因此以下操作不起作用:

var foo = new Counter(4);
foo.hack = function() { // is not getting defined in the same scope that the original count was
    count = 1337;
};

这将更改
计数器内部的变量
计数
,因为
foo.hack
未在该范围内定义
,相反,它将创建或覆盖全局变量
计数

好点。。。看起来我只需要在构造函数中发送这些回调。
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();
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);
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
var foo = new Counter(4);
foo.hack = function() { // is not getting defined in the same scope that the original count was
    count = 1337;
};