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

如何基于类属性简便创建含当前类已有属性的对象?

简便提取MobX类属性生成请求对象的方案

嘿,我懂你不想每次手动列一堆属性的心情——这种重复代码确实挺磨人的!结合你用MobX的场景,给你几个实用的简化方案:

方案1:给类添加专属的属性提取方法

直接在User类里写一个方法,专门返回需要提交的用户数据,以后要改属性只需要维护这一个地方:

class User { 
  @observable username = ''; 
  @observable email = ''; 
  @observable password = ''; 
  @observable gender = ''; 
  @observable errors = {}; 

  // 新增方法,统一处理需要提交的属性
  @action toUserData() {
    return {
      username: this.username,
      email: this.email,
      password: this.password,
      gender: this.gender
    };
  }

  @action submitRegister() { 
    const userData = this.toUserData();
    Axios.post('/api/users', userData).then(/* 你的后续逻辑 */);
  }
}

这种方式的好处是清晰可控,别人看代码一眼就知道哪些属性会被提交,而且后续属性变更时只需要修改toUserData方法,不用到处找提交逻辑。

方案2:用「属性列表+提取工具函数」简化

如果不想写单独的方法,可以把需要的属性存在一个数组里,配合提取工具函数(可以用现成的也可以自己写):

用Lodash的pick(如果项目已引入)

import { pick } from 'lodash';

class User { 
  // ... 你的属性定义 ...

  @action submitRegister() { 
    // 定义需要提取的属性列表
    const submitFields = ['username', 'email', 'password', 'gender'];
    const userData = pick(this, submitFields);
    Axios.post('/api/users', userData).then(/* ... */);
  }
}

自己写轻量版提取函数(不想加依赖的话)

如果项目没引入Lodash,写个几行的小函数就行:

// 可以放在工具文件里复用
const pick = (obj, keys) => {
  return keys.reduce((result, key) => {
    result[key] = obj[key];
    return result;
  }, {});
};

// 然后在类里用:
class User { 
  // ... 属性 ...

  @action submitRegister() { 
    const submitFields = ['username', 'email', 'password', 'gender'];
    const userData = pick(this, submitFields);
    Axios.post('/api/users', userData).then(/* ... */);
  }
}

这种方式的优势是代码更简洁,属性列表集中管理,适合属性较多的场景。

方案3:自动过滤不需要的属性(适合属性多且排除项少的情况)

如果你的类里大部分属性都需要提交,只有少数几个(比如errors)要排除,可以遍历实例属性自动过滤:

class User { 
  // ... 属性 ...

  @action submitRegister() { 
    const userData = {};
    // 遍历实例自身的可枚举属性
    for (const key in this) {
      // 排除不需要提交的属性,同时跳过MobX的内部属性(以$开头)
      if (key !== 'errors' && !key.startsWith('$')) {
        userData[key] = this[key];
      }
    }
    Axios.post('/api/users', userData).then(/* ... */);
  }
}

⚠️ 注意:这种方式要谨慎用,后续如果新增了不需要提交的属性,一定要记得更新过滤条件,不然会把不该传的字段提交给后端。


个人更推荐方案1或方案2,既清晰又好维护,能有效避免重复代码的问题。

内容的提问来源于stack exchange,提问作者felixbreuer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:42:12