You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:38:47