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



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

(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 工作,以便函数 A 和函数 B 可以访问闭包中的私有 2。

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

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

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

( 直到 被复制到其中 :)

如果我private1private 2同一个对象说......只是private...然后使用this关键字访问它。

但是,我宁愿将它们分开。

您的代码存在语法错误,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 方法可以通过闭包访问 private1private2,您可以通过特权方法访问它们,正如 Douglas Crockford 在他的文章 Private Members in JavaScript 中所解释的那样。扩展上述内容,可能是:

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

最新更新