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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:55:24