为啥 Javascript 无法识别我的构造函数?

Posted

技术标签:

【中文标题】为啥 Javascript 无法识别我的构造函数?【英文标题】:Why does Javascript not recognize my constructor?为什么 Javascript 无法识别我的构造函数? 【发布时间】:2021-07-23 08:35:44 【问题描述】:

我遇到的问题是脚本无法识别类中的构造函数,并假设我将所有其他函数都称为构造函数。

class Articles 
    constructor(dbName = ':memory:') 
        return(async() => 
            this.db = await sqlite.open(dbName)
            const sql =  //an Sql command goes here
            await this.db.run(sql)
            return this
        )()
    
    async all() 
        const sql = 'SELECT users.user, articles.* FROM articles, users\
                        WHERE articles.userid = users.id;'
        const articles = await this.db.all(sql)
        for(const index in articles)
            if(articles[index].photo === null) articles[index].photo = 'avatar.jpg'
            const dateTime = new Date (articles[index].D&T)
            const date = `$dateTime.getDate()/$dateTime.getMonth()+1/$dateTime.getFullYear()`
            articles[index].Date_Time = date
        
        return articles
    
    async add(data) 
        console.log('ADD')
        console.log(data)
        return true
    
    async close() 
        await this.db.close()
    

export default Articles

当我运行这部分代码时:

router.post('/add', async ctx => 
    const a = await new Articles(dbName)
    try
        await new a.add(ctx.request.body)
        return ctx.redirect('/?msg=new article added')
     catch(err) 
        console.log(err)
        await ctx.render('error', ctx.hbs)
     finally 
        new a.close()
    
)

这是我得到的错误:

It Keeps telling me that the function is not a constructor

谁能帮忙

【问题讨论】:

错误信息是正确的——“add”和“close”不是构造函数,它们是“Articles”类的方法。因此,在调用它们时不要使用“new”关键字 哥们我爱死你了!!!我已经坚持了8个小时以上了!!非常感谢! 【参考方案1】:

“add”和“close”是“Articles”类的方法。调用这些方法时不要使用“new”关键字

router.post('/add', async ctx => 
    const a = await new Articles(dbName)
    try
        await a.add(ctx.request.body)    // <- don't need "new" here
        return ctx.redirect('/?msg=new article added')
     catch(err) 
        console.log(err)
        await ctx.render('error', ctx.hbs)
     finally 
        a.close()    // <- don't need "new" here
    
)

【讨论】:

谢谢。就是这样!!

以上是关于为啥 Javascript 无法识别我的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 org.springframework.test.web.servlet.MockMvc 框架无法解析控制器的构造函数参数

如果我尝试在不同的公共类中将数组作为参数传递,为啥我的构造函数无法在 Java 中编译?

为啥这个构造函数无法在 Codeigniter 中加载?

Swift 无法识别这个特定的 Objective C 类构造函数

为啥我的 bash 脚本无法识别 date 命令中的变量?

为啥在 JavaScript 中函数既是构造函数又是对象?