如何将函数转换为类?

时间:2020-10-18 22:32:07

标签: javascript node.js ecmascript-6

我想将一个返回多个函数的函数转换为带有只能用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(),但这没用。

2 个答案:

答案 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());
    }
}

但是,如上所述,原型继承是此用例的更好机制。