Node.js类构造器赋值的属性在静态方法中未定义问题求助
问题核心原因
- 构造函数中赋值的
this.SESSION是实例属性,仅属于new出来的Helper实例对象,与Helper类本身无关。 setProduct是静态方法,绑定在Helper类上,内部的this指向Helper类,而非实例,自然无法访问到实例上的SESSION属性。- 直接写
SESSION访问的是当前作用域的变量,helper.js中没有定义该变量,必然抛出未定义错误。 - 你写的静态
SESSIONgetter存在递归死循环问题:访问this.SESSION会触发静态getter本身,调用就会栈溢出,建议直接删除或者修改存储属性名。
解决方案
方案1:将setProduct改为实例方法(最推荐,符合你传参实例化的使用逻辑)
修改helper.js,去掉setProduct的static关键字:
module.exports = class Helper { constructor(SESSION, VARS) { this.SESSION = SESSION; this.VARS = VARS; console.log('Hi session', this.SESSION, this.VARS); } // 去掉static,改为实例方法 setProduct() { console.log('Hi setProduct', this.SESSION); // 补充你的业务逻辑 } }
修改index.js的调用方式,用实例调用方法:
const SESSION = 'bla bla'; const VARS = 'abc'; const Helper = require('./helper'); const helpertest = new Helper(SESSION, VARS); // 用实例调用,不是类调用 const x = helpertest.setProduct(); console.log('End result :', x);
方案2:保留setProduct为静态方法,将属性挂载到类本身
如果你的业务逻辑必须要求setProduct是静态方法,修改构造函数将属性挂载到Helper类上:
module.exports = class Helper { constructor(SESSION, VARS) { // 给类本身赋值,所有实例共享该属性 Helper.SESSION = SESSION; Helper.VARS = VARS; console.log('Hi session', this.SESSION, this.VARS); } // 建议删除这个递归的静态getter,或者修改为 // static get SESSION() { // return this._SESSION; // } static setProduct() { console.log('Hi setProduct', this.SESSION); // 补充你的业务逻辑 } }
注意:该方案下如果多次new Helper传入不同的SESSION,后面的赋值会覆盖之前的取值。
内容的提问来源于stack exchange,提问作者Kim K.
相关产品推荐
相关产品推荐

