我正在尝试创建模仿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选择器缓存到一个对象中并在将来使用该对象。
答案 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的所有实例都可以访问的私有缓存(通过在最外层的闭包内声明缓存,或者停止使用原型模式。