2017-04-03 64 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

相关问题