JavaScript通过原型链实现继承需两步:一是用Object.create(Parent.prototype)设置子类原型并修正constructor指向;二是在子类构造函数中用Parent.call(this, args)继承实例属性,再扩展自有属性和方法;ES6 class是其语法糖。

JavaScript 中通过原型链实现子类对父类属性的扩展,核心是让子类的 prototype 正确指向父类的一个实例(或等效对象),同时保留子类自身构造函数的指向,并在子类中调用父类构造函数以继承实例属性。
设置正确的原型链关系
要使子类能访问父类原型上的方法和属性,需将子类的 prototype 关联到父类的原型。常用做法是使用 Object.create(Parent.prototype),避免直接用 new Parent()(防止执行父类构造逻辑或传参问题):
-
错误写法(会执行父类构造函数,且可能污染原型):
Child.prototype = new Parent(); -
推荐写法(干净建立原型继承):
Child.prototype = Object.create(Parent.prototype); -
补全 constructor 指向(否则
child.constructor会指向Parent):Child.prototype.constructor = Child;
在子类构造函数中调用父类构造函数
原型链只继承「原型上的属性/方法」,而父类在构造函数中通过 this.xxx 初始化的实例属性,必须显式调用父类构造函数才能继承:
- 使用
Parent.call(this, ...args)在子类构造函数内调用,确保this绑定到新创建的子类实例上 - 可传入参数,让父类初始化逻辑复用(如
Person.call(this, name, age)) - 这一步不是原型链本身的要求,但实际开发中几乎总是需要,否则子类实例缺少父类定义的实例属性
在子类中扩展自己的属性和方法
完成上述两步后,子类即可安全地在其 prototype 上添加新方法,或在构造函数中定义新实例属性:
立即学习“Java免费学习笔记(深入)”;
- 新增原型方法:
Child.prototype.sayHello = function() { return 'Hi, I am ' + this.name; }; - 新增实例属性(通常在构造函数里):
this.grade = grade; - 可覆盖父类方法(重写同名方法),如需调用父类版本,可用
Parent.prototype.methodName.call(this)
现代替代方案说明(ES6 class)
虽然底层仍是原型链,但 class 语法大幅简化了上述流程:
-
class Child extends Parent自动建立原型链并修复constructor -
super(...args)替代Parent.call(this, ...args) - 子类中用
super.method()调用父类方法,语义更清晰 - 本质未变,只是语法糖 —— 编译后仍操作
__proto__和call


















