翻閱meteor TODOs app我注意到了一個特定的類模式。當沒有構造函數存在時,調用`new`調用的結果。 ES6課
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。
編輯 - 下面的答案
我已經取代我的第二代碼片段與Mongo.Collection.call(this)
的評論,裏面應該有預期的效果。但是,我收到錯誤Error: use "new" to construct a Mongo.Collection
。我不確定解決此問題的最佳方法。
EDIT 2 - 下面的調查
在Mongo.Collection構造函數中發現的違規行,導致錯誤是:
if (! (self instanceof Mongo.Collection))
throw new Error('use "new" to construct a Mongo.Collection');
因爲instanceof
試驗的Mongo.Collection.prototype
存在了原型鏈,它顯然不存在。在地方
Mongo.Collection.call(this);
你有你的評論:
這是通過改變
Object.setPrototypeOf(ListsCollection, Mongo.Collection);
解決了
Object.setPrototypeOf(ListsCollection, Mongo.Collection.prototype);
爲什麼不堅持上課? –
我通常會這樣做,我只是簡單地把這個模式完成,看看我在項目結束時對它的感受。這裏描述的優點:[相關YDKJS章](https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch6.md) –
是你的第一個例子有什麼問題嗎?如果Mongo.Collection.call不適合你,它對我來說更好。 – lilezek