JavaScript原型链继承需三步:一、子类prototype设为new Parent()实例以构建链式访问;二、手动修正constructor指向Child;三、子类构造函数中用Parent.call(this)继承实例属性。

JavaScript 中用原型链构建继承体系,核心是让子构造函数的 prototype 指向父构造函数的一个实例,从而让子类实例能沿原型链访问父类的方法和属性。
设置子类 prototype 为父类实例
这是原型链继承最基础的一步。不能直接赋值 Parent.prototype,而要用 new Parent() 创建实例作为子类原型:
- 这样做后,子类实例的
__proto__会指向该实例,而该实例的__proto__又指向Parent.prototype,形成链式访问 - 注意:父类构造函数会在设置原型时执行一次,若它依赖参数或有副作用(如修改全局状态),需谨慎
修复 constructor 指向
用 new Parent() 赋值给 Child.prototype 后,Child.prototype.constructor 会变成 Parent,不是预期的 Child:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 手动修正:
Child.prototype.constructor = Child - 否则通过
instance.constructor获取构造函数时会出错,影响 instanceof 判断和实例创建逻辑
组合使用 call/apply 实现属性继承
原型链只能继承方法,无法在创建子类实例时初始化父类的实例属性(比如 this.name):
立即学习“Java免费学习笔记(深入)”;
- 在子类构造函数中调用
Parent.call(this, ...args),把父类的实例属性“借”过来 - 这样每个子类实例都有独立的属性副本,避免引用类型属性被共享
- 典型写法:
function Child(name, age) { Parent.call(this, name); this.age = age; }
避免直接修改父类原型
子类原型是父类的一个实例,如果后续修改这个实例(如 Child.prototype.xxx = ...),不会影响 Parent.prototype,但容易混淆:
- 推荐只在
Child.prototype上添加子类专属方法,不覆盖或误改继承来的属性 - 若需扩展父类行为,应在
Parent.prototype上统一修改,确保所有子类同步受益

















