javascript原型继承本质是构造函数定义实例属性、prototype共享方法;子类通过object.create继承父类prototype并重置constructor。

JavaScript 中的原型继承本质是通过构造函数定义实例属性和方法,再利用 prototype 属性共享方法,让多个实例复用同一份逻辑,同时保持各自独立的状态。
构造函数定义实例专属数据
构造函数负责初始化每个对象独有的属性(如姓名、年龄),每次用 new 调用时都会创建一份新副本。
例如:
function Person(name, age) {
this.name = name;
this.age = age;
}
这样每个 Person 实例都有自己的 name 和 age,互不影响。
prototype 添加共享方法
把方法挂到构造函数的 prototype 上,所有实例都能访问它,但不重复创建函数对象,节省内存。
比如添加一个通用行为:
Person.prototype.sayHello = function() {
console.log(`Hello, I'm ${this.name}`);
};
此时 new Person('Alice', 25) 和 new Person('Bob', 30) 都能调用 sayHello(),且共用同一个函数引用。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
实现单层原型继承(子类继承父类)
让子构造函数的 prototype 指向父构造函数的一个实例,再修正 constructor 指针,就完成了基础继承。
步骤如下:
- 定义父构造函数(如
Animal)并设置其prototype方法 - 定义子构造函数(如
Dog),内部调用Animal.call(this, ...)继承实例属性 - 用
Object.create(Animal.prototype)设置Dog.prototype - 手动恢复
Dog.prototype.constructor = Dog
示例:
function Animal(name) {
this.name = name;
}
Animal.prototype.eat = function() {
console.log(`${this.name} is eating`);
};
function Dog(name, breed) {
Animal.call(this, name); // 继承实例属性
this.breed = breed;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
console.log(`${this.name} is barking`);
};
这样 new Dog('Leo', 'Golden') 既有 bark(),也能调用 eat()。
注意 constructor 指针与 instanceof 判断
修改 prototype 后,constructor 会指向父类,影响 instanceof 和调试识别。必须显式重置:
Dog.prototype.constructor = Dog;
否则 new Dog() instanceof Dog 仍为 true,但 console.log(new Dog().constructor) 会显示 Animal,容易引发混淆。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










