如何构建虚拟对象缓存?

时间:2011-12-02 15:48:35

标签: javascript

我有一组对象,我希望能够使用相同的语法

  • 构建新对象或
  • 加载现有对象。

我已经构建了一个“缓存”,它使用对象和创建对象的上下文,并使用此数据来查看该对象是否先前已创建。因此,例如,如果我构建theObject = new myObject(param1, param2),缓存会将对象保存为{ obj: theObject, context: { param1: param1, param2: param2 } },如果我给它一个具有相同值param1和{{}的上下文,则会再次加载1}}。

我以为我很聪明,能够像这样构建对象:

param2

可悲的是,我了解到myObject = function(param1, param2) { var context = { param1: param1, param2: param2 }; var cacheHit = this.cache.find(context); if (cacheHit) return cacheHit; // <-- Doesn't work :( this.param1 = param1; this.param2 = param2; this.cache.save(this, context); }; myObject.prototype = { cache: new myCacheObject }; // Shared cache in all instances 关键字意味着我无法使用new语句。我希望内部化缓存集合,以便可以在没有内置缓存的情况下构建类似的对象,并且它们的工作方式相同。但是,我不认为我可以使用return关键字执行此操作。

我将如何完成这项工作?

更新

事实证明,这种方法确实有效,我的问题源于继承(特别是因为这是JavaScript继承)。扩展此对象时,我使用以下语法:

new

由于调用父构造函数不能强制子项返回值,因此子项必须明确表示这一点。

myObject = function(param1, param2) {
  if (arguments.length) {
     var context = { param1: param1, param2: param2 };
     var cacheHit = this.cache.find(context);

     if (cacheHit) return cacheHit;

     this.param1 = param1;
     this.param2 = param2;
     this.cache.save(this, context);
   }
};

// Extended from myObject
anotherObject = function(foo, bar) {
  // Call parent constructor
  myObject.call(this, foo, bar);
};

anotherObject.prototype = new myObject;
anotherObject.prototype.constructor = anotherObject;

希望我能提出一种更简洁的方法,因为如果子类在其构造函数中执行任何操作,我将始终检查是否返回了值。

anotherObject = function(foo, bar) {
  return myObject.call(this, foo, bar);
};

2 个答案:

答案 0 :(得分:4)

  

我了解到new关键字意味着我无法使用return语句。

幸运的是,that's not true。如果您返回非空对象引用(请参阅详细信息的链接答案),new运算符实际上会让您按照自己的意愿执行操作。

答案 1 :(得分:3)

只是不要使用new关键字,或者至少不要在缓存函数之外使用它

var getObject = function(param, param2) {
  var context, cacheHit, obj;
  context = { param1: param1, param2: param2 };
  cacheHit = this.cache.find(context);
  if (cacheHit) {
    return cacheHit
  }

  obj = new myObject(param1, param2); 
  this.cache.save(obj, context);
  return obj;
}

随后:

var someObj = getObject("a","b");

将从缓存中返回myObject的实例(如果存在),或者创建一个新实例。