javascript原型链中调用父级方法需显式使用parent.prototype.method.call(this);es6类中可用super替代,更安全简洁;避免使用__proto__等非标准方式。

在 JavaScript 中,原型对象方法里调用“父级方法”,本质是调用被当前方法覆盖(重写)的、上一级原型链上的同名方法。由于 JS 没有原生的 super 关键字(ES6 类语法中才有),在基于原型的手动构造函数/原型链模式下,需要显式引用父级原型上的方法。
通过 Parent.prototype.methodName.call(this, ...) 显式调用
这是最常用、最可靠的方式。你需要知道父构造函数的名称,并直接从其 prototype 上取方法,再用 call 或 apply 绑定当前实例上下文(this)和参数。
例如:
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name} makes a sound`);
};
function Dog(name, breed) {
Animal.call(this, name); // 调用父构造函数
this.breed = breed;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.speak = function() {
// ✅ 正确:显式调用父级 speak 方法
Animal.prototype.speak.call(this);
console.log(`...and barks!`);
};
这样调用时,Dog.prototype.speak 先执行父级逻辑,再追加子类逻辑。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
避免直接写 this.__proto__.__proto__.methodName()
虽然 this.__proto__ 可以访问当前原型,this.__proto__.__proto__ 理论上能到达父原型,但这种方式:
- 依赖非标准、已废弃的
__proto__属性,不推荐用于生产环境 - 耦合了原型链深度,一旦继承层级变化就容易出错
- 无法准确对应“哪个父类”的方法(多层继承时易混淆)
ES6 类语法中用 super 更简洁(推荐新项目)
如果你使用 class 语法,JS 引擎会自动维护原型关系,且支持 super 关键字:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // ✅ 调用父构造函数
this.breed = breed;
}
speak() {
super.speak(); // ✅ 直接调用父级方法
console.log(`...and barks!`);
}
}
super 在类方法中自动指向父类原型上的同名方法,语义清晰、安全可靠。
注意:不要在箭头函数中用 super 或依赖 this 原型链
箭头函数没有自己的 this 和 super,它会沿作用域链向上找。如果把重写的方法写成箭头函数挂到原型上,super 会报错,this.__proto__ 也可能指向错误对象。原型方法应始终使用普通函数声明。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










