我想将一个返回多个函数的函数转换为带有只能用new
关键字调用的构造函数的类。
我尝试过这个:
const toast = () => {
return ({
getToast: () => {
return 'toast'
},
setToast: () => {
return 'wtf'
}
})
}
class t {
constructor() {}
}
const t1 = t.bind(toast())
const tt = new t1()
console.log(tt.getToast)
但是它会打印undefined
。
我也尝试过Object.assign(t, toast())
,或者只是在构造函数中做过this = toast()
,但这没用。
答案 0 :(得分:0)
我不知道您要做什么。可能是您在寻找这个。
const toast = () => {
return ({
getToast: () => {
return 'toast'
},
setToast: () => {
return 'wtf'
}
})
}
class t {
constructor(fn) {
return fn;
}
}
const tt = new t(toast())
console.log(tt.getToast())
console.log(tt.setToast())
答案 1 :(得分:0)
对于您的确切情况,也就是说,如果函数返回的对象仅具有函数而没有非函数属性,那么一种实现方法就是简单地使用原型继承:
function t () {}; // though by convention a class should REALLY be uppercase
t.prototype = toast();
现在您可以这样做:
let bread = new t();
let bagel = new t();
bread.getToast();
bagel.getToast();
您还可以使用一种称为寄生继承的设计模式,但这会降低内存效率,因为就像toast()
函数一样,它为每个对象创建函数的副本:
class t {
constructor () {
let tmp = toast();
// Copy methods to our instance:
for (let prop in tmp) {
this[prop] = tmp[prop];
}
}
}
或者用Object.assign()
可以简单地是:
class t {
constructor () {
Object.assign(this, toast());
}
}
但是,如上所述,原型继承是此用例的更好机制。