JavaScript 的原型链(prototype chain)是其实现继承和属性、方法共享的核心机制,其主要作用可以归纳为以下几点:
1. 属性/方法查找
- 当你访问 `obj.someProp` 时,JavaScript 首先在 `obj` 自身(own properties)上查找
- 如果没找到,就沿着 `obj` 的内部链接 `[[Prototype]]`(通常我们通过 `__proto__` 或 `Object.getPrototypeOf` 拿到)去它的原型对象上查找
- 一直往上查,直到找到属性或到达原型链顶端 `null`
2. 实现继承
- 通过把子对象的 `[[Prototype]]` 指向父对象,就能让子对象“继承”父对象的属性和方法
- 例如,设 `Person.prototype` 上有一个 `greet()` 方法,所有通过 `new Person()` 创建的实例都能共享这个 `greet`,而不必在每个实例中都拷贝一份
3. 方法和数据的共享,节省内存
- 把要共享的方法放在原型上,而非构造函数内部
- 多个实例公用同一个函数引用,避免重复创建,从而提升效率
4. 构建“类”与面向对象模式
- 虽然 JS 本质上是基于原型的,但结合 ES6 的 `class` 语法背后也是原型链工作:
```js
class A { foo() { … } }
class B extends A { bar() { … } }
// B.prototype.[[Prototype]] 指向 A.prototype
```
5. 多态和动态扩展
- 既可以在实例上覆盖(shadow)原型方法,也可以在运行时给原型补充新方法,所有实例即时生效
- 这种动态特性在灵活性上优于传统类继承
简单示例:
```js
function Person(name) {
this.name = name; // 实例属性
}
Person.prototype.sayHi = function() {
console.log('Hi, I am ' + this.name);
};
const alice = new Person('Alice');
alice.sayHi(); // Hi, I am Alice
// 查找 sayHi 时:
// 1. 在 alice 上找 → 没有
// 2. 去 alice.__proto__(也就是 Person.prototype)上找 → 找到并执行
```
总结:原型链最核心的作用,就是为 JavaScript 对象提供了一种灵活、高效的继承和共享机制。