2017-08-03 54 views
0

翻閱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); 
+1

爲什麼不堅持上課? –

+0

我通常會這樣做,我只是簡單地把這個模式完成,看看我在項目結束時對它的感受。這裏描述的優點:[相關YDKJS章](https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch6.md) –

+0

是你的第一個例子有什麼問題嗎?如果Mongo.Collection.call不適合你,它對我來說更好。 – lilezek

回答

1

我想你想做的事情。

請記住,JavaScript中的一個類,不管是舊版本還是新的ES6版本,都是代表它自己的構造函數的函數。

+0

當然,現在看起來很明顯......我在想類似的東西,比如'(new Mongo.Collection).bind(this)'但是我知道你不能將'bind'和'new'結合起來。 –

+0

不幸的是,使用'Mongo.Collection.call(this)'我得到錯誤:'錯誤:使用「new」構造一個Mongo.Collection' –

+0

解決方案的問題編輯。由於我對這個答案的編輯已被接受,所以我將其標記爲答案。 –