如何在JavaScript中为类添加动态命名属性并赋值给新变量?
问题描述
我定义了如下类:
class classA { id: number; name: string; constructor(data){ this.id = data?.id || 0; this.name = data?.name || ''; } }
将该类赋值给变量classDef:
const classDef = classA;
现在希望为classDef对应的类添加一个动态属性,属性名称由变量parentFieldName指定(示例值为'parent_id'),属性类型为number,初始值为0,最终类定义及构造函数需包含该属性的声明与初始化,请问如何实现?
解决方案
方法一:创建动态子类(推荐,类型安全)
通过继承原类生成子类,在子类中动态添加目标属性,不会影响原类的其他实例,符合面向对象设计原则:
const parentFieldName = 'parent_id'; // 生成继承自classDef的增强类 const EnhancedClass = class extends classDef { [parentFieldName]: number; // 声明动态属性的类型 constructor(data) { super(data); // 调用父类构造函数初始化原有属性 this[parentFieldName] = data?.[parentFieldName] || 0; // 初始化动态属性 } }; // 使用示例 const instance = new EnhancedClass({ id: 1, name: 'test', parent_id: 5 }); console.log(instance.parent_id); // 输出 5
方法二:修改原类(不推荐,会污染原类)
如果需要全局为原类添加该属性,可以修改原类的构造函数并补充类型声明,但此操作会影响所有后续创建的原类实例:
const parentFieldName = 'parent_id'; // 保存原构造函数,避免覆盖后丢失原有逻辑 const originalConstructor = classDef.prototype.constructor; // 重写构造函数,添加动态属性的初始化逻辑 classDef.prototype.constructor = function(data) { originalConstructor.call(this, data); this[parentFieldName] = data?.[parentFieldName] || 0; }; // 为TypeScript补充类型声明,确保类型检查通过 interface classA { parent_id: number; } // 使用示例 const instance = new classDef({ id: 2, name: 'demo', parent_id: 3 }); console.log(instance.parent_id); // 输出 3
内容的提问来源于stack exchange,提问作者M.Imran Mamda
相关产品推荐
相关产品推荐

