在jQuery中访问私有变量的问题,如可链接的设计模式

时间:2010-05-15 13:24:09

标签: javascript jquery

我正在尝试创建模仿jQuery设计模式的自定义工具箱。基本上,这个想法有点来自这篇文章:jQuery plugin design pattern (common practice?) for dealing with private functions(检查“大卫”给出的答案)。

所以这是我的工具箱功能:

(function(window){
    var mySpace=function(){
        return new PrivateSpace();
    }

    var PrivateSpace=function(){
        var testCache={};
    };    

    PrivateSpace.prototype={
        init:function(){
            console.log('init this:', this);
            return this;
        },
        ajax:function(){
            console.log('make ajax calls here');
            return this;
        },
        cache:function(key,selector){
            console.log('cache selectors here');
            testCache[key]=selector;
            console.log('cached selector: ',testCache);
            return this;
        }
    }
    window.hmis=window.m$=mySpace();
})(window)

现在,如果我执行此函数,如:

  console.log(m$.cache('firstname','#FirstNameTextbox'));

我收到错误'testCache'未定义。我无法在原型的缓存功能中访问变量“testCache”。我该如何访问它?基本上,我想要做的是,我想将所有jQuery选择器缓存到一个对象中并在将来使用该对象。

2 个答案:

答案 0 :(得分:5)

testCache隐藏在new PrivateSpace创建的闭包中。 这里使用的正确模式是

var PrivateSpace=function(){
    this.testCache={};
};   

PrivateSpace.prototype={
    cache:function(key,selector){
        this.testCache[key]=selector;
        return this;
    }
}

这里必不可少的部分是this

但整条代码似乎有点人为 - 当只创建一个实例时,没有理由使用原型模式。您应该依赖通过共享范围(闭包)访问的变量。

(function(window)(
     var cache = {}, mylib;

     window.mylib = mylib =  {
          cache: function(key, selector) {
              cache[key] = selector;
              return mylib;
          }
     }

})(window);

<强>更新
顺便说一句,遵循jQuery模式而没有真正的理由这样做;)

<强>更新
对于PrivateSpace来说,更好的方法可能是

function PrivateSpace(){
    var cache = {};
    return {
        cache: {
            get: function(key){
                return cache[key];
            },
            set: function(key, value) {
                cache[key] = value;
            }
         },
         init: function() {
             ...
         }
     };
 }

这是通常用于提供私人成员的模式..

答案 1 :(得分:1)

原型模式不允许每个实例的私有变量。

您可以使用PrivateSpace的所有实例都可以访问的私有缓存(通过在最外层的闭包内声明缓存,或者停止使用原型模式。

相关问题