1. JavaScript原型机制的本质
在JavaScript中,每个对象都有一个隐藏的[[Prototype]]属性,它指向另一个对象,我们称之为"原型对象"。这个原型对象也有自己的原型,如此层层链接,直到某个对象的原型为null为止。这种链式结构就是所谓的原型链。
关键理解:当访问对象的属性时,如果对象自身没有该属性,JavaScript引擎会沿着原型链向上查找,直到找到该属性或到达原型链末端(null)。
1.1 原型与类的区别
对于熟悉Java或C++等基于类的语言的开发者来说,JavaScript的原型机制可能显得有点"怪异":
- 动态性:原型可以在运行时修改,这与静态类定义完全不同
- 灵活性:没有严格的类层次结构,任何对象都可以作为其他对象的原型
- 轻量级:不需要定义类就能创建对象间的继承关系
javascript复制// 简单的原型继承示例
const parent = { value: 2 };
const child = { __proto__: parent };
console.log(child.value); // 2 - 从parent继承
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 原型链的工作机制
2.1 属性查找过程
当访问对象属性时,JavaScript引擎会执行以下步骤:
- 检查对象自身是否有该属性
- 如果没有,检查对象的[[Prototype]](即原型对象)
- 继续沿着原型链向上查找,直到找到属性或原型为null
javascript复制const grandparent = { a: 1 };
const parent = { b: 2, __proto__: grandparent };
const child = { c: 3, __proto__: parent };
console.log(child.a); // 1 - 来自grandparent
console.log(child.b); // 2 - 来自parent
console.log(child.c); // 3 - 自身属性
2.2 属性遮蔽(Property Shadowing)
如果对象和它的原型有同名属性,对象的属性会"遮蔽"原型中的属性:
javascript复制const parent = { value: 1 };
const child = {
value: 2, // 遮蔽了parent的value
__proto__: parent
};
console.log(child.value); // 2 (不是1)
3. 构造函数与原型
3.1 构造函数的工作原理
JavaScript中的构造函数是创建对象的特殊函数。当使用new调用函数时:
- 创建一个新对象
- 将新对象的[[Prototype]]指向构造函数的prototype属性
- 将this绑定到新对象并执行构造函数
- 返回新对象(除非构造函数返回非原始值)
javascript复制function Person(name) {
this.name = name;
}
