【发布时间】:2017-08-04 03:33:03
【问题描述】:
查看meteor TODOs app,我注意到了一个特定的类模式。
class ListsCollection extends Mongo.Collection {
//Other methods, no constructor
}
export const Lists = new ListsCollection('lists');
此代码使用new,尽管没有ListsCollection 构造函数。我的解释是,Mongo.Collection 的构造函数被原型委托调用。
在我的其余代码中,我使用的是Kyle Simpson's OLOO Pattern,我想在这里使用相同的模式。
const ListsCollection = {
init() {
//Call the constructor of Mongo.Collection
return this;
},
//Same methods
}
Object.setPrototypeOf(ListsCollection, Mongo.Collection);
export const Lists = Object.create(ListsCollection).init('lists');
我已经开始了,但是我不确定如何调用Mongo.Collection 类的构造函数。任何建议将不胜感激:D。
编辑 - 以下答案
我已将第二个代码 sn-p 中的注释替换为 Mongo.Collection.call(this),这应该具有预期的效果。但是,我收到错误Error: use "new" to construct a Mongo.Collection。我不确定解决此问题的最佳方法。
编辑 2 - 后续调查
在 Mongo.Collection 构造函数中发现导致错误的违规行是:
if (! (self instanceof Mongo.Collection))
throw new Error('use "new" to construct a Mongo.Collection');
由于instanceof 在原型链上游测试Mongo.Collection.prototype 的存在,它显然不存在。
通过修改解决了这个问题
Object.setPrototypeOf(ListsCollection, Mongo.Collection);
到
Object.setPrototypeOf(ListsCollection, Mongo.Collection.prototype);
【问题讨论】:
-
为什么不坚持上课?
-
我通常会,我只是将这个模式完成,看看我在项目结束时对它的感受。优点在这里描述:relevant YDKJS chapter
-
你的第一个例子有问题吗?如果 Mongo.Collection.call 不适合你,我看起来会更好。
-
在上面的评论中提到过。我应该能够同时做到这一点。
标签: javascript meteor ecmascript-6