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();}}}
。虽然我仍然不明白为什么这个限制是必要的,我不这么认为。那是毫无用处的。