原型方法可见性取决于定义位置和this指向,只要存在于实例原型链且未被遮蔽即可访问;继承通过原型链实现,父类prototype方法默认对子类实例可见;遮蔽、static方法、私有方法#各有严格访问限制。

Class 继承中,原型方法的可见性取决于**方法定义的位置**和**调用时的 this 指向**,而不是单纯看是否用了 static 或是否在子类里重写。核心规则就一条:只要方法存在于实例的原型链上,且未被遮蔽,就能被访问。
原型方法默认对子类实例可见
使用 extends 的 class 继承,本质是建立原型链:子类实例的 __proto__ → 子类 prototype → 父类 prototype → Object.prototype。因此,父类定义在 prototype 上的方法(即非 static、非实例属性赋值的方法),天然可被子类实例调用。
- 父类方法写在 class body 内、不加
static,就自动挂到Parent.prototype上 - 子类没重写该方法时,调用会顺着原型链找到父类版本
- 即使子类构造函数里没显式调用
super(),只要方法不依赖未初始化的实例属性,调用仍可能成功(但通常不推荐)
遮蔽(Shadowing)会切断原型链查找
如果子类在自己的 prototype 上定义了同名方法,就会覆盖(遮蔽)父类原型上的方法,此时子类实例调用的是自己的版本,不再向上查找。
- 遮蔽只影响同名方法,不影响其他父类方法
- 子类内部可用
super.methodName()显式调用被遮蔽的父类方法 - 遮蔽发生在运行时:修改子类
prototype会实时影响所有已有和新建的实例
静态方法与实例方法不可互相访问
static 方法属于类本身,挂在构造函数上(如 Parent.method),不在原型链中。因此:
- 子类实例无法直接调用父类或自身的
static方法(没有隐式绑定) - 子类
static方法中可用super.staticMethod()调用父类静态方法(ES2022+ 支持) - 实例方法中不能用
this.constructor.staticMethod()反向调用,除非明确知道构造函数引用
私有方法(#)完全不可继承
用哈希前缀声明的私有方法(#method)仅在定义它的 class 内部可访问,不会出现在原型上,也不参与原型链查找。
- 子类无法继承、重写或调用父类的私有方法
- 子类内部定义的同名私有方法,与父类的完全无关,彼此隔离
- 试图在子类中通过
super.#method访问会报语法错误











