我有一组对象,我希望能够使用相同的语法
我已经构建了一个“缓存”,它使用对象和创建对象的上下文,并使用此数据来查看该对象是否先前已创建。因此,例如,如果我构建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);
};
答案 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的实例(如果存在),或者创建一个新实例。