【发布时间】:2016-04-28 11:34:49
【问题描述】:
我正在考虑一个简单的问题。我已经给了一个类,例如Model
class Model {
constructor(parameters = {}) {
this.id = parameters.id;
}
}
如您所见,我们可以创建新的Model 对象,例如:let model = new Model()。更复杂的示例如下所示:
//we have some data given from API maybe?
let parameters = {id: 1};
let model = new Model(parameters );
现在我们正处于我开始徘徊的地方如果给定id的对象已经存在怎么办?
问题是我应该使用什么模式来实例化具有给定id 的对象一次?
让我们更进一步:如果我们将获得嵌套对象带有循环引用?假设我们有另一个名为 AnotherModel 的类,我们的代码如下所示:
class Model {
constructor(parameters = {}) {
this.id = parameters.id;
this.anotherModel= nulld;
if (parameters.anotherModel) {
this.anotherModel= parameters.anotherModel instanceof AnotherModel
? parameters.anotherModel
: new AnotherModel(parameters.anotherModel);
}
}
}
class AnotherModel {
constructor(parameters = {}) {
this.id = parameters.id;
this.models = [];
if (parameters.models) {
for (let i = 0; i < parameters.models.length; i++) {
let model = parameters.models[i];
model.anotherModel= this;
this.models.push(new Model(model));
}
}
}
}
所以AnotherModel 包含Models 的集合,Model 对象包含对AnotherModel 的引用。
解决此问题的好方法是什么?我们想要实现的是只有一个具有相同 id 的对象。
我的想法是做某种 ObjectPool,我将存储给定类的所有对象,当实例化新对象时,如果它不存在,我们的池将创建一个新对象或返回现有对象?
但这里有个小缺点,例如,如果我们已经编写了一些代码,我们将不得不重构并将我们实例化它们的方式从 new Model() 更改为 ObjectPool.get(Model, parameters)?
你有什么想法?
【问题讨论】:
-
在上面的场景中,是先创建了
AnotherModel的实例吗?还是可以单独创建Model和AnotherModel的实例?我不确定我是否理解您的代码的工作方式。 -
个别而言,如果我们先创建
AnotherModel或Model无关紧要 -
如果这是一个愚蠢的问题,我很抱歉,但是两个组件是否有必要保持对彼此的引用?尤其是这条线对我来说意义不大:
: new AnotherModel(parameters.anotherModel);(从模型创建AnotherModel而不传递Model本身) -
因为我们的想法是我们得到一些数据形式的 API,例如,它可能是一个非常不同的情况,例如我们将得到
AnotherModel和它Model's 那么它更容易在AnotherModel构造函数中创建model对象你不觉得吗?我们还可以单独下载数据,例如 2AnotherModels,如果他们收集相同的Model怎么办?我们不想再次创建相同的模型对象 -
没有什么可以阻止构造函数使用对象池。无需重写现有代码。
标签: javascript oop ecmascript-6