子类实例能访问父类原型方法,核心是让子类原型继承父类原型而非等于它;需通过object.setprototypeof或extends建立原型链,并修复constructor,同时用super()或parent.call()继承实例属性。

JavaScript 中子类实例能访问父类原型上的方法,核心在于让子类的原型对象继承父类的原型对象,也就是把父类原型设为子类原型的原型(即建立原型链)。这通过修改子类 prototype 的内部 [[Prototype]] 实现,现代标准做法是用 Object.setPrototypeOf() 或更推荐的 class 语法配合 extends 自动完成。
用构造函数 + 原型链手动实现继承
这是理解原型继承本质的方式:先让子构造函数的 prototype 对象“指向”父构造函数的 prototype,再修复子类原型的 constructor 指回自身。
- 使用
Object.setPrototypeOf(Child.prototype, Parent.prototype)显式设置原型链 - 手动设置
Child.prototype.constructor = Child,避免 constructor 被覆盖为 Parent - 这样创建的子类实例,调用方法时会沿原型链向上查找:实例 → Child.prototype → Parent.prototype → Object.prototype
用 ES6 class + extends 自动继承
这是最简洁、推荐的写法。extends 会自动将子类原型的 [[Prototype]] 指向父类原型,并正确设置 constructor。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义父类:
class Parent { say() { return 'hello'; } } - 定义子类:
class Child extends Parent {} - 此时
Object.getPrototypeOf(Child.prototype) === Parent.prototype为true - 任意
new Child()实例都能直接调用say(),无需额外操作
为什么不能只用 Child.prototype = Parent.prototype?
这种写法会让子类和父类共享同一个原型对象,导致在子类原型上添加方法时,父类也会“意外”获得该方法,破坏封装性。
- 错误示例:
Child.prototype = Parent.prototype;→ 修改Child.prototype.foo = ...实际改了Parent.prototype - 正确做法是让
Child.prototype“继承自”Parent.prototype,而不是“等于”它 - 相当于创建一个新对象,其内部原型指向父类原型,既复用方法,又保持独立性
补充:确保实例能访问父类实例属性(可选)
原型链解决的是“方法”的继承;若还需继承父类构造函数中初始化的实例属性(如 this.name),需在子类构造函数中调用 super()(class)或 Parent.call(this, ...)(构造函数)。
-
class中必须在constructor首行写super(),否则报错 - 构造函数模式下,用
Parent.call(this, ...)把父类实例属性“复制”到子类实例上 - 注意:这步不影响原型链本身,但影响实例自身的属性可访问性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










