访问要修改的对象的复制版本?

时间:2012-10-10 22:52:22

标签: javascript

如果我将代码复制到这样的闭包中

(function(){
    var private1 = {},
        private2 = {},
        publik;

    publik.get(object){
         private1[object.name] = object;
    };

    window.publik = publik;
}())


publik.get({
    // API
    name: 'name_foo',
    functionA: function(){
        // I can not access private2 in here
    },
    functionB: function(){}
})

API是否可以工作,因此functionA和functionB可以访问闭包内的private.2。

它们将被复制到闭包中,因此复制的版本应该可以访问它。这就是我制作闭包并将private1和private2放在一起的原因。

该对象的书面版本(不是复制版本)在jslint中引发错误,我的猜测是因为它违反了范围规则。

函数参数(非参数)是全局范围内的未命名变量,无法访问闭包。

(直到将其复制到其中:)

如果我将private1private 2相同的对象说成只有private ...然后使用this关键字进行访问,那么它是否有效。

我宁愿将它们分开。

1 个答案:

答案 0 :(得分:1)

您的代码存在语法错误,而 get 似乎更好地命名为 set 。此外,您的代码似乎并不特定于浏览器,因此最好使用比特定窗口对象更通用的全局对象。

考虑类似的事情:

(function(global){
    var private1 = {name: 'private1'},
        private2 = {name: 'private2'},
        publik;

    publik = {
      set: function (object) {
        private1[object.name] = object;
      }
    };

    global.publik = publik;
}(this))

publik.set 方法可以通过闭包访问 private1 private2 ,您可以通过Douglas所解释的特权方法访问它们克罗克福德在他的文章Private Members in JavaScript中。扩展上述内容,可能是:

    publik = {

      set : function (...) {
        ...
      },

      getPrivate1: function (name) {
        return (typeof name == 'string')? private1[name] : private1;
      },

      ...

    };