2017-04-03 26 views
0

我正在使用在其模塊中實現ES6類的JavaScript庫。我沒有在JavaScript中使用經典繼承,並希望實質上「撤消」他們的類實現。有沒有辦法讓我能夠接受這些課程,並仍然以工廠/作曲的方式使用它們。我想利用JS原型繼承和對象的易堆積性。以下是我迄今爲止的一個例子。最終,我試圖避免使用類和新的,因爲我不習慣在JavaScript中使用它。任何人都可以告訴我,如果我以正確的方式接近這一點,或者我只是在浪費時間,謝謝。如何創建工廠函數而不是使用類

class Example { 

constructor(id) { 
    this.id = id; 
} 

getID() { 
    console.log(this.id); 
} 
} 


function convertClassToObject(theClass) { 
var x = new theClass(); 
var newX = Object.create(x); 
return newX; 
} 

var NewPrototype = convertClassToObject(Example); 

function NewFactory(options) { 
var x = Object.assign(Object.create(NewPrototype), options); 
return x; 
} 

var NewInstance = NewFactory({id: 123456789}); 
+3

'class'是圍繞構造函數和原型構建只是語法糖。所有內容仍然以原型爲基礎。 '新的例子(id)'相當於'var obj = Object.create(Example.prototype); obj.constructor(ID)'。 –

+0

哦,完美的,我可以將原型與Object.create連接起來,並將該實例用於工廠。 – jhamPac

+2

@MikeC除了在ES6中,其中構造函數*必須用'new'(或'super()'或'Reflect.construct')調用) – Bergi

回答

2

你還是習慣new,這比在工廠做原型的繼承要簡單得多。

當然,這是微不足道的一個構造函數轉換爲一個工廠函數:

function classToFactory(constr) { 
    return (...args) => new constr(...args); 
} 

const makeExample = classToFactory(Example); 
const newInstance = makeExample(123456789); // no `new` any more 
+0

我想我可以嘗試習慣新的關鍵字。感謝您的見解。 – jhamPac

相關問題