basemodel 是一个通用前端数据模型基类,封装初始化、校验、序列化、变更通知等逻辑,支持继承扩展:构造时自动挂载合法字段,tojson 返回纯净数据,clone 深拷贝新实例,onchange 监听变化,set 触发回调,isvalid 依赖子类 validate 实现。

设计一个通用的前端数据模型基类,核心是封装常用数据操作逻辑(如初始化、校验、序列化、变更通知),同时保持可扩展性,不绑定具体业务字段。ES6 的 class 提供了清晰的语法支撑,但需注意它仍是原型继承的语法糖,不是全新对象模型。
基础结构:构造、属性与默认行为
基类应接收原始数据并完成标准化初始化,避免每次子类都重复写 this.xxx = xxx。使用类字段(public)声明可被继承的默认状态,构造函数中做数据合并与规范化:
- 用
constructor(data = {})接收初始数据,支持空对象兜底 - 将传入字段自动挂载到
this,但跳过方法、undefined 或私有键(如以_或#开头) - 定义
toJSON()方法,返回纯净数据对象(排除方法、私有字段、不可枚举属性) - 提供
clone()方法,返回新实例而非浅拷贝引用
数据校验与变更控制
前端模型常需响应式更新或提交前校验。基类不实现具体规则,但预留钩子和基础能力:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 添加
isValidgetter,内部调用可被子类重写的validate()方法 - 在属性赋值时(通过 setter 或显式
set(key, value))触发onChange回调,支持监听字段变化 - 用私有字段
#data存储原始数据快照,便于对比变更(hasChanged())或回滚(reset())
继承与扩展:支持业务子类定制
子类应能轻松添加业务专属逻辑,而无需修改基类。关键点包括:
- 子类用
extends BaseModel继承,构造函数中必须先调super(data) - 覆盖
validate()实现字段必填、格式、范围等校验,返回{ valid: boolean, errors: string[] } - 添加静态
fromAPI(response)工厂方法,处理接口返回数据的字段映射(如后端用user_name,前端存为name) - 可选:用私有方法
#normalizeInput()统一预处理输入(如日期字符串转Date对象)
实用示例:一个简明 BaseModel 实现
以下是一个轻量但可用的基类骨架(不含第三方依赖):
class BaseModel {#data = {};
#listeners = [];
constructor(data = {}) {
Object.keys(data).forEach(key => {
if (key[0] !== '#' && typeof data[key] !== 'function') {
this[key] = data[key];
}
});
this.#data = { ...this };
}
toJSON() {
return Object.fromEntries(
Object.entries(this).filter(([k, v]) =>
typeof v !== 'function' && !k.startsWith('#')
)
);
}
clone() {
return new this.constructor(this.toJSON());
}
onChange(cb) {
this.#listeners.push(cb);
return () => this.#listeners = this.#listeners.filter(f => f !== cb);
}
set(key, value) {
const prev = this[key];
this[key] = value;
if (prev !== value) {
this.#listeners.forEach(cb => cb(key, value, prev));
}
}
get isValid() {
return this.validate?.().valid !== false;
}
validate() {
return { valid: true };
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










