Object.getPrototypeOf仅返回对象直接原型,不负责提取“最原始的基类契约”;该契约需通过遍历原型链、识别构造函数名(如Entity)、校验契约标识(如__isCoreContract)或固定方法签名来定位。
Object.getPrototypeOf 本身不负责“精准提取最原始的基类契约”,它只返回对象直接原型。所谓“最原始的基类契约”,需结合原型链遍历、构造函数识别与契约语义判断,而非单靠一次调用就能达成。
它返回指定对象的**直接原型**(即 obj.__proto__),不是整个原型链的起点,也不关心“契约”含义。例如:
这里得到的是 Object.prototype,但它并非你业务中定义的“基类契约”,只是语言内置的终点。
Mixin 通常通过 Object.assign、类继承或装饰器叠加行为,导致原型链被拉长且构造函数可能失真。要定位“最原始的基类契约”,关键不是找链底,而是找**第一个承载核心接口定义、无 mixin 行为注入的构造函数原型**。
Object.getPrototypeOf(),直到遇到构造函数名符合你约定的基类名(如 Entity、ViewModel)Mixin、With、Enhanced 的原型init()、toJSON(),或 Symbol 标记 Symbol.for('coreContract')
不要依赖 obj.constructor.prototype —— Mixin 可能篡改 constructor 指针;也不要假设 Object.getPrototypeOf(obj) === obj.constructor.prototype 恒成立(尤其在 class 继承 + Mixin 组合时易断开)。
Object.getPrototypeOf(obj) 获取当前层级原型proto.constructor.name 判断类型,但需配合白名单校验(防止伪造 name)Object.defineProperty(Base.prototype, '__isCoreContract', { value: true })
以下函数尝试沿原型链向上查找首个标记为基类契约的原型:
function findCoreContract(obj) {注意:该函数假设你在设计阶段已对基类原型做了明确标记,而非运行时逆向推断“最原始”。契约必须由设计约定驱动,不能仅靠反射猜解。