Javascript Class.method不是使用ES6类的函数
我创建了一个类,并希望在node.js应用程序的routes中使用该方法。 一个简单的代码片段描述了我在真实应用程序中遇到的一个可笑的问题 myClass.js:Javascript Class.method不是使用ES6类的函数,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我创建了一个类,并希望在node.js应用程序的routes中使用该方法。 一个简单的代码片段描述了我在真实应用程序中遇到的一个可笑的问题 myClass.js: class MyClass { static async sayHi(name) { setTimeout(() => { return `Hello ${name}` }, 3000) } } module.exports = new MyClass()
class MyClass {
static async sayHi(name) {
setTimeout(() => {
return `Hello ${name}`
}, 3000)
}
}
module.exports = new MyClass()
index.js:
const MyClass = require('./myClass');
console.log(MyClass.sayHi)
我得到了这个错误:
undefined
尝试:
console.log(MyClass.sayHi('Hello'))
返回:
MyClass.sayHi is not a function
您正在导出MyClass的一个实例。静态方法不在类的实例上调用,而是在类本身上调用 如果您像这样导出MyClass:module.exports=MyClass,那么第二种方法应该有效 编辑:
正如@T.J.克劳德指出的那样。如果类位于名为MyClass.js的文件中,请从该文件导入,而不是从索引导入。您正在导出MyClass的实例。静态方法不在类的实例上调用,而是在类本身上调用 如果您像这样导出MyClass:module.exports=MyClass,那么第二种方法应该有效 编辑:
正如@T.J.克劳德指出的那样。如果该类位于名为MyClass.js的文件中,请从该文件导入,而不是从索引导入。您正在导出该类的实例-导入时,您有一个实例,而不是实际的类。调用导入的对象MyClass会让人困惑——也许可以将其称为myClassInstance,这样可以清楚地说明问题所在 如果您有一个实例,并且希望对该类调用静态方法,请引用.constructor属性 如果要异步返回某些内容,最好使用承诺,然后调用。然后在sayHi调用中使用承诺: 类MyClass{ 静态sayHiname{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 解析“Hello${name}”; }, 1000; }; } } const myClassInstance=新的MyClass; //module.exports=myClassInstance; //index.js: //const myClassInstance=require'./index'; myClassInstance.constructor.sayHi'foo'
.thenconsole.log 您正在导出类的实例-导入时,您有一个实例,而不是实际的类。调用导入的对象MyClass会让人困惑——也许可以将其称为myClassInstance,这样可以清楚地说明问题所在 如果您有一个实例,并且希望对该类调用静态方法,请引用.constructor属性 如果要异步返回某些内容,最好使用承诺,然后调用。然后在sayHi调用中使用承诺: 类MyClass{ 静态sayHiname{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 解析“Hello${name}”; }, 1000; }; } } const myClassInstance=新的MyClass; //module.exports=myClassInstance; //index.js: //const myClassInstance=require'./index'; myClassInstance.constructor.sayHi'foo'
.thenconsole.log 将行从实例更改为类本身,因为静态方法是可以在不创建类实例的情况下调用的方法
module.exports = MyClass;
并将require更改为文件名
const MyClass = require('./myClass.js');
将行从实例更改为类本身,因为静态方法是可以在不创建类实例的情况下调用的方法
module.exports = MyClass;
并将require更改为文件名
const MyClass = require('./myClass.js');
@穆塔扎·侯赛因是对的 因为方法是静态的。您可以只导出类,而不创建实例
module.exports = MyClass;
@穆塔扎·侯赛因是对的 因为方法是静态的。您可以只导出类,而不创建实例
module.exports = MyClass;
你在哪里测试console.logMyClass.sayHi'Hello'?您从未导出该类,因此您将永远无法从外部调用该代码FWIW这正是您应该如何调用该函数,因为它是静态的。不要导出module.exports=new MyClass,导出MyClass本身!你在哪里测试console.logMyClass.sayHi'Hello'?您从未导出该类,因此您将永远无法从外部调用该代码FWIW这正是您应该如何调用该函数,因为它是静态的。不要导出module.exports=new MyClass,导出MyClass本身!进口也不正确。应该是require./MyClass,而不是require./index@LawrenceCherone它不会工作,但我想这本身就是个问题。T.J.Crowder,我编辑了原始答案。输入也不正确。应该是require./MyClass,而不是require./index@LawrenceCherone它不会工作,但我想这本身就是个问题。T.J.Crowder,我编辑了原始答案。