调用JavaScript静态方法及this.constructor调用均报TypeError求助
我看到你遇到的问题:调用JavaScript静态方法时触发TypeError,甚至用this.constructor调用也不行。咱们来一步步拆解问题出在哪,怎么修复。
问题根源分析
先看你提供的parent.js里的静态方法_sanitizeData,里面的递归调用注释写的是this.constructor._sanitizeData(data[prop])——这就是问题核心!
在静态方法中,this指向的是当前类本身(比如parent),但this.constructor指向的是Function构造函数(因为所有类都是Function的实例)。Function并没有定义_sanitizeData方法,所以调用它自然会抛出TypeError: this.constructor._sanitizeData is not a function。
另外还要确认你的child.js是否正确继承了parent类,如果没有用extends关键字继承,实例的this.constructor就不会关联到parent,同样会找不到静态方法。
修复方案
1. 修正静态方法内的递归调用
在静态方法里,直接用this._sanitizeData()来递归调用自身,因为this已经指向当前类了:
// parent.js 修正后的_sanitizeData module.exports = class Parent { persist(data) { data = this.constructor._sanitizeData(data); // 后续使用清洗后的数据的代码 } static _sanitizeData(data) { for (let prop in data) { if (typeof data[prop] === 'object' && data[prop] !== null) { // 直接用this调用静态方法,替代this.constructor this._sanitizeData(data[prop]); } else if(data[prop] === '') { delete data[prop]; } } return data; } }
2. 确保子类正确继承父类
在child.js中,必须用extends关键字继承Parent,这样子类实例的this.constructor才会指向子类,而子类会自动继承父类的静态方法:
// child.js 完整示例 const Parent = require('./parent.js'); class Child extends Parent { // 可添加子类专属方法或重写父类方法 } // 实例化测试 const childInstance = new Child(); childInstance.persist({ name: '', age: 25, address: { street: '', city: 'New York' } });
3. 可选优化:避免修改原始数据
你的当前代码直接修改了传入的data对象,如果不想污染原始数据,可以创建一个副本再处理:
static _sanitizeData(data) { const sanitized = { ...data }; // 创建浅拷贝 for (let prop in sanitized) { if (typeof sanitized[prop] === 'object' && sanitized[prop] !== null) { sanitized[prop] = this._sanitizeData(sanitized[prop]); } else if(sanitized[prop] === '') { delete sanitized[prop]; } } return sanitized; }
这样修改后,原始数据不会被改动,更符合函数式编程的最佳实践。
验证修复
现在调用persist方法时,this.constructor._sanitizeData会正确指向子类(如果有继承)或父类的静态方法,递归调用也不会再抛出TypeError了。
内容的提问来源于stack exchange,提问作者Rohith Mohan

