首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Class.method不是使用ES6类的函数。

问Class.method不是使用ES6类的函数。
EN

Stack Overflow用户
提问于 2019-06-13 09:59:03
回答 4查看 4K关注 0票数 2

我创建了一个类,并希望在我的node.js应用程序的路由中使用该方法。一个简单的代码片段描述了我在实际应用程序中遇到的一个笑脸问题。

myClass.js:

代码语言:javascript
复制
class MyClass {
    static async sayHi(name) {
        setTimeout(() => {
            return `Hello ${name}`
        }, 3000)
    }
}

module.exports = new MyClass()

index.js:

代码语言:javascript
复制
const MyClass = require('./myClass');
console.log(MyClass.sayHi)

我发现了一个错误:

代码语言:javascript
复制
undefined

试着:

代码语言:javascript
复制
console.log(MyClass.sayHi('Hello'))

返回:

代码语言:javascript
复制
MyClass.sayHi is not a function
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-13 10:03:25

您正在导出类的实例--导入时,您有一个实例,而不是实际的类。调用导入的对象MyClass是令人费解的--也许将其称为myClassInstance,这将清楚问题所在。

如果您有一个实例,并且希望在类上调用一个静态方法,请引用.constructor属性。

如果您想异步返回某项内容,最好使用一个承诺,然后在sayHi调用上调用sayHi以使用该承诺:

​

代码语言:javascript
复制
class MyClass {
  static sayHi(name) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(`Hello ${name}`);
      }, 1000);
    });
  }
}

const myClassInstance = new MyClass();
// module.exports = myClassInstance;

// index.js:

// const myClassInstance = require('./index');
myClassInstance.constructor.sayHi('foo')
  .then(console.log);

​

静态方法不需要是async,因为您已经显式地返回了一个承诺。

票数 4
EN

Stack Overflow用户

发布于 2019-06-13 10:01:56

您正在导出MyClass的一个实例。静态方法不是对类的实例调用的,而是对类本身调用的。

如果您像这样导出MyClass:module.exports = MyClass,那么您的第二种方法应该可以工作。

编辑:

@T.J.Crowder指出。如果类位于名为MyClass.js的文件中,则从那里导入而不是索引。

票数 3
EN

Stack Overflow用户

发布于 2019-06-13 10:07:20

将行从实例更改为类本身,因为静态方法是可以调用的方法,而无需创建类的实例。

代码语言:javascript
复制
module.exports = MyClass;

并将要求更改为文件名。

代码语言:javascript
复制
 const MyClass = require('./myClass.js');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56577976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档