JavaScript原型链是基于对象的动态继承模型,通过[[Prototype]]隐式引用实现属性委托查找,class仅为语法糖,本质仍是原型链;它强调运行时对象行为共享,而非编译期类型结构。
JavaScript 的原型链是理解对象行为的核心机制,它不是“类的替代品”,而是一种基于对象的、动态的继承模型。与传统面向对象语言中的类继承相比,原型链更灵活、更轻量,但也更容易让人困惑——关键在于:原型链操作的是运行时的对象关系,而类继承(如 Java 或 C++)描述的是编译时的类型结构。
每个 JavaScript 对象内部都有一个隐式引用([[Prototype]]),指向它的原型对象。当访问一个属性或方法时,引擎会先在当前对象上查找;没找到,就顺着 [[Prototype]] 去原型对象上找;还没找到,就继续向上查,直到原型为 null(即到达原型链顶端)。这个逐级委托的过程就是原型链。
例如:
const animal = { eats: true };
const dog = { bark() { return "woof"; } };
Object.setPrototypeOf(dog, animal);
console.log(dog.eats); // true ← 从 animal 原型上获取
象的 [[Prototype]]),别和内部 [[Prototype]] 混淆。ES6 引入的 class 并未改变底层机制,它只是让基于原型的继承写起来更像传统类语言:
class Animal {
constructor(name) { this.name = name; }
speak() { console.log(`${this.name} makes a sound`); }
}
class Dog extends Animal {
bark() { console.log("woof!"); }
}
这背后仍是原型链: Dog.prototype.__proto__ === Animal.prototype Animal.prototype.__proto__ === Object.prototype
传统类继承强调“类型定义 + 编译期检查”,而原型链强调“对象行为 + 运行时委托”:
当你需要:
不复杂但容易忽略。