可用javascript原型继承快速搭建轻量orm:通过object.create()构建共享方法的模型原型链,各模型继承并扩展专属逻辑,结合schema校验、持久化钩子与tojson数据隔离,实现无框架的数据对象统一行为管理。
可以用 javascript 原型继承快速搭一个轻量 orm 模型,核心是让数据对象拥有统一行为(如保存、验证、同步),又不依赖框架或数据库驱动。
用 Object.create() 建立模型原型链
先定义一个基础模型原型,它不实例化数据,只提供通用方法:
- 创建空对象作为基类原型:
const ModelProto = {}; - 在它上面挂载方法,比如
save()、isValid()、toJSON(); - 每个具体模型(如 User、Post)都用
Object.create(ModelProto)继承它,再添加自己独有的属性和逻辑。
这样所有实例共享方法,节省内存,也便于统一维护。
给模型实例注入数据与行为
模型不是类,而是“可复用的原型模板”:
- 定义构造函数(如
function User(data) { Object.assign(this, data); }); - 设置其 prototype 为继承自 ModelProto 的对象:
User.prototype = Object.create(ModelProto);; - 再在
User.prototype上加专属方法,比如getUserRole(); - 实例化后,既拥有通用能力(
user.save()),也有业务逻辑(user.getUserRole())。
实现简单数据映射与持久化钩子
ORM 的关键不在“映射表”,而在“把 JS 对象操作转成数据动作”:
- 在
ModelProto.save中,检查是否已有 id:有则调用update,无则走create; - 用
this.constructor.tableName || 'default'约定模型对应的数据源标识; - 可内置回调,比如
beforeSave或afterSync,通过在原型上预留钩子函数实现; - 实际发送请求时,只传
this.toJSON(),避免暴露内部方法或原型链。
支持属性代理与字段校验
让对象像“带逻辑的字典”一样使用:
- 重写
get/set行为需借助Object.defineProperty或 ES6 Proxy(若兼容性允许); - 更轻量的做法:在
ModelProto中定义_schema = { name: { type: 'string', required: true } },并在isValid()中按 schema 校验this的字段; - 赋值时不做拦截,但调用
save()前自动触发校验,失败则返回错误,不发请求。
不复杂但容易忽略:原型继承下,this 永远指向实例本身,所有状态保留在实例上,方法由原型共享——这正是轻量 ORM 可靠又易调试的基础。










