JavaScript原型继承的核心是让子类原型指向父类原型,推荐Object.create()配合constructor修正;ES6 extends语法本质相同但自动处理;避免直接new父类赋值原型。

JavaScript中继承原型的核心是让子类的原型对象指向父类的实例,同时修正构造函数指向。最常用且推荐的方式是使用 Object.create() 搭配手动修正 constructor。
用 Object.create 实现原型继承
这是最清晰、标准的做法,避免了直接赋值原型带来的副作用(比如共享引用类型属性)。
- 先定义父类构造函数和原型方法
- 子类构造函数内部调用父类(可选,用于初始化实例属性)
- 用
Object.create(Parent.prototype)创建新原型对象 - 将该对象赋给
Child.prototype - 手动设置
Child.prototype.constructor = Child
示例:
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; // 修复 constructor
Dog.prototype.speak = function() {
console.log(this.name + ' barks');
};
ES6 class 的 extends 语法(底层仍是原型继承)
现代写法更简洁,但本质还是基于原型链。它自动处理了原型链接和 constructor 修正。
立即学习“Java免费学习笔记(深入)”;
-
class Dog extends Animal会自动设置Dog.prototype.__proto__ === Animal.prototype - 必须在子类构造函数中调用
super(),否则报错 - 子类方法中可用
super.xxx()调用父类同名方法
不推荐的老式写法:直接赋值 prototype
比如 Dog.prototype = new Animal(); 看似简单,但有明显问题:
- 执行了父类构造函数,可能产生无意义的实例属性(如未传参时的
undefined) - 如果父类构造函数有副作用(如发请求、修改全局状态),会被意外触发
- 无法传递参数给父类构造函数来初始化子类实例
检查继承关系是否生效
验证原型链是否正确建立:
-
dog instanceof Dog→ true -
dog instanceof Animal→ true -
Dog.prototype.isPrototypeOf(dog)→ true -
Animal.prototype.isPrototypeOf(dog)→ true -
Object.getPrototypeOf(dog) === Dog.prototype→ true


















