原型链设置必须在定义实例方法之前完成,否则方法会被覆盖;构造函数内不依赖原型共享状态;es6 class中super()必须优先调用;可防御性检测并修复原型异常。

关键在于控制原型链设置的时机——必须在定义任何实例方法之前完成继承关系初始化,否则后续挂载的方法会被覆盖清空。
原型链设置必须放在方法定义之前
错误做法是先给 Constructor.prototype 添加方法,再用 Object.create(Parent.prototype) 覆盖整个原型对象。这会导致已挂载的方法全部丢失。
- ❌ 错误顺序:
A.prototype.method = function() {}→A.prototype = Object.create(B.prototype) - ✅ 正确顺序:
A.prototype = Object.create(B.prototype)→A.prototype.constructor = A→A.prototype.method = function() {}
构造函数内部不依赖原型上的可变状态
避免在构造函数执行中途读取或修改原型上共享的引用类型字段(比如数组、对象),因为此时原型可能尚未就绪或已被重置。
一款AI演示文稿工具,主要用于DeepSeek AI加持,输入主题生成专业PPT,支持Word/PDF等45种文档导入,职场汇报、教学提案轻松搞定,适合需要提升相关任务效率的用户。
- 所有实例专属数据都应在构造函数体内用
this.xxx = ...初始化 - 不要把
settings = {}、cache = []这类可变结构写在prototype上 - 若需默认配置,用 getter 返回新对象:
get defaults() { return { timeout: 3000 }; }
使用类语法时确保 super() 优先执行
ES6 class 中,子类构造函数必须在访问 this 前调用 super()。否则 this 不可用,且原型链未激活,后续赋值会失败或报错。
- 参数预处理可以放在
super()之前,但不能操作this -
super()之后才能安全地初始化实例属性、绑定事件、调用方法 - 漏掉
super()会导致ReferenceError,而非静默丢失字段
动态补救:检测并恢复被覆盖的原型方法
如果已有代码存在原型覆盖风险,可在关键节点做防御性检查:
- 创建实例后,验证
instance.constructor === ExpectedClass - 检查
Object.getPrototypeOf(instance)是否指向预期原型 - 发现异常时,用
Object.setPrototypeOf(instance, ExpectedClass.prototype)临时修复(仅限单个实例)
不复杂但容易忽略










