JavaScript中类的方法不能直接修改父类原型链,但可通过Object.getPrototypeOf(Child.prototype)访问Parent.prototype,或用super.prototype(ES2022+)调用父类原型方法,修改则需谨慎避免全局副作用。

通过 constructor 获取父类构造函数,再访问其 prototype
在子类实例方法中,可通过 this.constructor 拿到当前实例的构造函数(即子类),然后用 Object.getPrototypeOf 一层层向上追溯:
-
this.constructor→ 当前类(如Child) -
Object.getPrototypeOf(this.constructor.prototype)→ 就是父类的prototype - 再往上可继续调用
Object.getPrototypeOf(...)获取更上层原型(如Object.prototype)
示例:
class Parent { say() { return 'parent'; } }
class Child extends Parent {
checkParentProto() {
const parentProto = Object.getPrototypeOf(Child.prototype);
console.log(parentProto === Parent.prototype); // true
console.log(parentProto.say()); // 'parent'
}
}
在 static 方法中直接用 super.constructor 或父类名访问
静态方法中无法用 this,但可以直接用 父类名 或 super.constructor(需注意上下文):
-
Parent.prototype是最清晰、最安全的方式(前提是知道父类名) -
Object.getPrototypeOf(Child).prototype可用于动态获取(Object.getPrototypeOf(Child)是Parent)
注意:super 在 static 方法中指向父类本身,所以 super.prototype 是合法的(ES2022+ 支持):
class Child extends Parent {
static logParentMethod() {
console.log(super.prototype.say()); // ✅ 可以访问父类原型方法
}
}
不建议但可行:在子类方法中修改父类 prototype(慎用)
虽然技术上能改(比如给 Parent.prototype 加方法),但这是全局副作用,会影响所有父类实例和子类行为:
- 修改
Parent.prototype.xxx = ...会反映到所有继承链上的对象 - 除非明确设计为“向父类注入能力”(如插件系统),否则应避免
- 更推荐在子类自身
prototype上扩展,或用组合/代理代替原型污染
判断方法是否来自父类原型(用于调试或逻辑分支)
可用 hasOwnProperty 配合 Object.getPrototypeOf 判断某个方法定义在哪一层:
-
Parent.prototype.hasOwnProperty('say')→ 看是否直接定义在父类原型 -
Object.getPrototypeOf(this).hasOwnProperty('say')→ 在实例方法中,Object.getPrototypeOf(this)是实例的隐式原型(即Child.prototype),再往上才是Parent.prototype - 更稳妥:用
Object.getPrototypeOf(Object.getPrototypeOf(this))直达父类原型

















