Javascript 如何将函数转换为类?
我想将一个返回多个函数的函数转换成一个具有构造函数的类,该构造函数只能用Javascript 如何将函数转换为类?,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我想将一个返回多个函数的函数转换成一个具有构造函数的类,该构造函数只能用new关键字调用 我试过这个: const toast = () => { return ({ getToast: () => { return 'toast' }, setToast: () => { return 'wtf' } }) } class t { constructor() {} } const t1 = t.bind(
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)
但它打印未定义的
我还尝试了Object.assign(t,toast())
,或者在构造函数中简单地执行this=toast()
,但它不起作用。我不知道您想做什么。也许你在找这个
const toast=()=>{
返回({
getToast:()=>{
返回“吐司”
},
setToast:()=>{
返回“wtf”
}
})
}
t类{
建造师(fn){
返回fn;
}
}
const tt=新的t(toast())
console.log(tt.getToast())
console.log(tt.setToast())
对于您的确切场景,即如果函数返回一个只包含函数而不包含非函数属性的对象,一种方法是使用原型继承:
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());
}
}
然而,正如前面提到的,原型继承是这个用例更好的机制。为什么要这样做?你想解决什么问题?你为什么需要上课?如果您只想使用new
调用toast
,那么将其声明为普通函数将是最简单的解决方案。如果您不能这样做,那么函数t(){return toast();}
将起作用。这是否回答了您的问题?您可能需要考虑函数和箭头函数之间的区别。too@FelixKling谢谢您的回答,但是您仍然可以在没有new
的情况下调用该函数,对吗@RandyCasburn这对我没什么帮助,是的。如果您确实只想要一个可构造的函数,那么也可以执行类t{constructor(){return toast();}}}
。虽然我仍然不明白为什么这个限制是必要的,我不这么认为。那是毫无用处的。