如何在JavaScript类的花括号内定义变量?附代码示例
嘿,我来帮你搞定在JavaScript类里定义变量的问题,顺便优化下你现有代码里的小坑~
在JavaScript类中定义变量的几种方式
根据你的需求,在类的花括号内定义变量主要有这几种常用方式:
1. 类实例字段(ES6+推荐写法)
直接在类的花括号内声明,每个类实例都会拥有独立的字段副本:
class M_Profil { // 实例字段,每个实例各自持有一份 connection = require('../config/db.js'); q = require('q'); constructor() {} // ... 其他方法 }
2. 在constructor中定义实例属性
这是ES6早期的标准写法,通过给this赋值来挂载实例属性:
class M_Profil { constructor() { this.connection = require('../config/db.js'); this.q = require('q'); } // ... 其他方法 }
3. 静态类字段(类共享)
如果变量不需要每个实例都持有,而是整个类共享,就用static关键字声明:
class M_Profil { // 静态字段,属于类本身,所有实例共享 static connection = require('../config/db.js'); static q = require('q'); constructor() {} getDataProfil(params) { // 调用静态字段:M_Profil.connection } }
针对你现有代码的优化建议
你当前的代码里,connection、q、dfd都是类外部的全局变量,尤其是dfd会导致严重问题:每次调用getDataProfil都会复用同一个延迟对象,多次调用时会互相干扰(比如第一次请求还没完成,第二次请求就会修改同一个dfd的状态)。
这里是优化后的完整代码:
// 推荐把模块依赖放在顶部,因为模块只会加载一次 const connection = require('../config/db.js'); const q = require('q'); class M_Profil { constructor() {} getDataProfil(params) { // 每次调用方法都创建新的延迟对象,避免请求冲突 const dfd = q.defer(); connection.query("SELECT * FROM user WHERE id_user = ?", [params], function(err, rows, fields) { if (err) { dfd.reject(err); } else { dfd.resolve(rows[0]); } }); return dfd.promise; } } // 补充完整的控制器代码 class C_Profil { constructor() { // 实例化模型类 this.m_profil = new M_Profil(); } async profil_get(req, res, next) { try { // 等待Promise返回结果 const profilData = await this.m_profil.getDataProfil(req.user.id_user); res.json(profilData); } catch (err) { // 把错误传递给错误处理中间件 next(err); } } }
额外小贴士:用原生Promise替代q
现在JavaScript已经原生支持Promise了,完全可以不用依赖q,代码会更简洁:
const connection = require('../config/db.js'); class M_Profil { getDataProfil(params) { return new Promise((resolve, reject) => { connection.query("SELECT * FROM user WHERE id_user = ?", [params], function(err, rows, fields) { if (err) reject(err); else resolve(rows[0]); }); }); } }
内容的提问来源于stack exchange,提问作者hfbachri_
相关产品推荐
相关产品推荐

