核心是基于object.create构建干净原型链,子类原型继承父类原型而非实例,显式修复constructor,支持super调用、继承路径查询及es5兼容的extend工厂函数。

要实现一个支持多级原型继承的库,核心是让对象能正确访问其原型链上任意层级的方法和属性,同时避免污染原生原型、保持继承关系清晰可追溯。
基于 Object.create 的安全继承
不直接修改 constructor.prototype,而是用 Object.create 建立干净的原型链。子类原型应继承自父类原型,而不是父类实例,否则会共享引用类型属性。
- 用 Object.create(Parent.prototype) 设置子类 prototype,再补回 constructor
- 确保每个子类实例的
__proto__指向正确的原型对象,且该原型的__proto__指向上一级 - 例如:
Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child;
支持链式调用与 super 关键字模拟
多级继承中常需在子方法里调用父级同名方法。可通过闭包或动态绑定 this 和 arguments 实现类似 super 的能力。
- 在子类方法中,用 Parent.prototype.method.call(this, ...args) 显式调用上级逻辑
- 更优雅的方式是:在构造函数中注入一个
super对象,指向当前类的直接父类原型 - 注意:不能简单缓存
super为固定对象,因为不同层级的 super 应指向不同原型
提供可查询的继承路径工具
调试和运行时判断时,需要知道某个实例“属于哪几层继承结构”。可添加辅助方法如 instance.$ancestors() 或静态方法 Class.getAncestors()。
- 遍历
obj.__proto__链,收集所有非 Object.prototype 的 constructor.name - 返回数组如
['Animal', 'Mammal', 'Dog'],便于日志、权限校验或序列化策略选择 - 避免依赖
instanceof—— 它在跨 frame 或多次 defineProperty 后可能失效
兼容 ES5 且不侵入原生对象
真正的多级继承库必须不改写 Object、Function 等原生构造器,也不依赖 Proxy(ES6+)。用纯属性描述符和规范的原型操作即可达成。
- 所有继承关系通过
Object.defineProperty控制enumerable和writable,防止意外覆盖 - 暴露
extend(parent, props)工厂函数,内部完成原型链设置、constructor 修复、静态属性合并 - 对 getter/setter、不可枚举属性、symbol 键都保留原语义,不丢失元信息











