原型链终极指南:从__proto__到继承,手把手教你理解JavaScript核心机制
大家好,我是全栈老李。今天咱们来聊聊JavaScript里那个让人又爱又恨的原型链,这玩意儿就像是你家祖传的族谱,搞懂了它,JavaScript的继承机制就再也不是玄学了。
先来个灵魂拷问:为什么"abc".length
能正常工作?字符串明明不是对象啊!这就是原型链在背后默默干活的结果。当你访问一个基本类型的属性时,JavaScript会临时把它包装成对象,然后通过原型链找到对应的方法或属性。
一、原型链是个啥?
简单说,原型链就是JavaScript实现继承的方式。每个对象都有一个隐藏的[[Prototype]]
属性(可以通过__proto__
访问),指向它的"爸爸"。当访问一个对象的属性时,如果对象本身没有,就会去它爸爸那找,爸爸没有就找爷爷,一直找到顶层的Object.prototype
,这就是原型链。
function Person(name) {
this.name = name;
}
// 全栈老李提示:给构造函数的原型添加方法,所有实例都能共享
Person.prototype.sayHi = function() {
console.log(`Hi, I'm ${
this.name}`);
};
const lilei = new Person('李雷');
lilei.sayHi(); // Hi, I'm 李雷
// 全栈老李划重点:实例的__proto__指向构造函数的prototype
console.log(lilei.__proto__ === Person.prototype); // true
二、原型链的完整路径
让我们画个图更直观地理解:
lilei -> Person.prototype -> Object.prototype -> null
当你访问lilei.toString()
时,JavaScript会这样找:
- 先看
lilei
自己有没有toString
方法 → 没有 - 去
Person.prototype
找 → 也没有 - 去
Object.prototype
找 → 找到了! - 调用找到的方法
三、继承的几种姿势
1. 组合继承(最常用)
function Parent(