低代码平台中new不直接生成隔离实例,而是通过构造函数+作用域隔离+运行时上下文管理实现:将元数据编译为动态构造器,结合工厂方法注入租户/会话上下文,再用proxy和weakmap增强状态隔离与安全管控。

在低代码平台中,new 绑定本身不直接用于生成隔离的业务实体实例,它只是 JavaScript 中创建对象实例的语法机制。真正起作用的是“构造函数 + 作用域隔离 + 运行时上下文管理”的组合设计。平台需将用户定义的业务模型(如表单、流程、数据实体)编译或映射为可实例化的构造逻辑,并确保每次创建都拥有独立状态空间。
把用户配置转化为可 new 的构造器
低代码平台通常通过元数据(如 JSON Schema 或 DSL 描述)定义业务实体结构。平台运行时需将这些描述动态编译为构造函数:
- 例如,用户拖拽一个「客户」实体,平台读取其字段(name、email、status),生成类似
class Customer { constructor(data) { this.name = data.name; this.email = data.email; ... } }的类 - 该类不硬编码在源码里,而是由平台的“模型编译器”在加载页面/模块时动态生成(可用
Function构造或eval安全封装,更推荐 AST 解析+代码生成) - 构造器内部避免引用全局变量或共享闭包,所有依赖(如校验规则、关联关系)通过参数注入或从当前租户上下文获取
用 new 实例化时绑定租户与会话上下文
单纯 new Customer() 无法隔离,关键是在实例化前注入运行时隔离维度:
- 平台提供统一工厂方法(如
createEntity('Customer', { tenantId: 't123', sessionId: 's456' })),内部调用new Customer(...)前已将租户 ID、权限策略、数据源连接等上下文挂载到实例原型或私有字段 - 构造函数内可通过
this.$context访问隔离信息,后续的数据操作(如save())自动路由到对应租户数据库分片或沙箱环境 - 禁止在构造器中直接访问
window、localStorage等全局状态;所有外部能力通过平台注入的runtimeAPI提供,天然带租户过滤
配合 Proxy 和 WeakMap 实现无侵入状态隔离
为避免用户脚本意外污染实例状态,平台可在 new 出的实例外层套一层代理:
- 构造完成后,用
Proxy封装实例,拦截get/set操作,对敏感字段(如id、tenantId)做只读保护或自动补全 - 用
WeakMap存储每个实例的私有状态(如临时缓存、变更追踪标记),键为实例本身,生命周期与实例一致,垃圾回收自动清理,不造成内存泄漏 - 用户自定义方法(如通过低代码逻辑块配置的「提交前校验」)在沙箱函数中执行,
this绑定到该代理实例,确保访问的始终是当前实例的隔离视图
规避常见陷阱:不是所有 new 都安全
直接暴露 new 给用户脚本存在风险,平台应限制使用方式:
- 禁用用户直接写
new window.Customer()—— 所有构造器不挂载到全局,仅通过平台 API 获取(如api.getEntityClass('Order')) - 禁止跨实例共享引用:用户逻辑中若将某实例赋值给全局变量或传入非沙箱函数,平台需在运行时检测并报错或自动克隆
- 异步操作(如
await this.save())必须绑定当前实例的上下文,避免 Promise 回调中this丢失导致租户信息错乱











