如何在JS中将创建的对象作为函数调用

时间:2019-06-29 10:02:47

标签: javascript node.js

我有一个Notify类,例如:

class Notify {
    success(text) {
        // TODO
    }

    error(text) {
        // Todo
    }
}

export default new Notify();

使用时,我直接调用此类中的方法,例如Notify.success(),因此,现在我想尝试一种新的调用方法,例如Notify('my title', 'success')。在PHP中,我知道它是__invoke方法,但是在JS中,我不知道该如何使用。我可以在class中这样做吗?或者我必须使用“正常”功能。

请帮助我。谢谢。

3 个答案:

答案 0 :(得分:2)

JavaScript中没有__invoke的类似物。您可以创建一个函数,然后将属性附加到is,以便它也可以用作对象。

function notifyConstructor() {
  // Make the function
  const notify = (text, type) => {
    switch (type) {
      case 'success': return notify.success(text);
      case 'error': return notify.error(text);
      default: throw TypeError(`Unknown type "${type}"`);
    }
  };

  // Attach public properties and methods to the function
  notify.success = text => {
    // TODO
  };
  notify.error = text => {
    // Todo
  };

  return notify;
}

const notify = notifyConstructor();  // Make a Notify instance
notify('my title', 'success');       // Call the instance
notify.success('my title');          // Call an instance method

答案 1 :(得分:1)

您可以使用上下文this来获取函数,如下所示。

如果您自己调用函数invoke(堆栈溢出错误),请小心。

class Notify {
  constructor() {
  }
  
  invoke(msg, fn) {
    if (this[fn]) {
      this[fn](msg);
    } else throw new Error("Illegal argument Error.");
  }
  
  success(text) {
    console.log('Success:', text);
  }

  error(text) {
    console.log('Error:', text);
  }
}

let notify = new Notify();
notify.invoke('my title', 'success');
notify.invoke('my title', 'error');
notify.invoke('my title', 'ele');

或者直接在实例化对象上方:

class Notify {
  constructor() {
  }
  
  success(text) {
    console.log('Success:', text);
  }

  error(text) {
    console.log('Error:', text);
  }
}

let notify = new Notify();
notify['success']('my title');
notify['error']('my title');

答案 2 :(得分:1)

在javascript对象属性中,使用点(.)的访问是使用数组表示法([])访问属性的简写表示法。但是,简写表示法确实要求属性名称符合用于标识符的语法。

假设Notify是导入实例的名称,

Notify["success"]("my title"]

等同于

Notify.success( "my title")