原型链是javascript中对象查找属性和方法的继承机制。对象通过__proto__指针逐级向上访问原型,直至object.prototype.__proto__为null;构造函数的prototype是实例共享的“基因库”,class只是基于原型链的语法糖。

原型链就是 JavaScript 里对象找“爹”的过程。
每个对象都有一个“上一辈”
当你创建一个对象(比如 let obj = {}),它内部悄悄连着另一个对象——它的原型。这个连接不是靠血缘,而是靠一个叫 __proto__ 的隐式指针。就像孩子会从父母那里继承某些特征,对象也会从它的原型那里“继承”属性和方法。
比如:
- obj.toString() 能用,不是因为 obj 自己定义了这个方法,而是它顺着 __proto__ 找到了 Object.prototype,而这个原型上正好有 toString;
- 再往上,Object.prototype.__proto__ 是 null——这就到头了,相当于家族谱系的始祖,没爹了。
构造函数和原型是“造人手册”和“家族基因库”
写 function Person(name) { this.name = name; },这函数本身不是“人”,但它配有一本《家族基因库》:Person.prototype。你往这个原型上加方法(比如 Person.prototype.sayHi = function(){...}),所有用 new Person() 创建出来的实例,都能通过原型链共享这个方法。
这就像:同一本家谱(prototype)管着几十个后代(实例),大家共用一套打招呼方式,不用每人单独背一遍。
查找规则很简单:先查自己,再问爹,再问爷爷……直到问到 null
当你访问 instance.age:
- 先看 instance 自身有没有 age 属性;
- 没有?就去 instance.__proto__(也就是 Constructor.prototype)里找;
- 还没?继续往上翻,比如 Constructor.prototype.__proto__(通常是 Object.prototype);
- 一直找到 Object.prototype.__proto__ === null 还没找到,就返回 undefined。
ES6 的 class 其实只是语法糖,底层还是原型链
写 class Animal { speak() { ... } },看着像 Java,其实 JS 引擎把它悄悄转成了基于原型的操作:方法被挂到了 Animal.prototype 上。所以 class 并没有改变原型链的本质,只是让写法更整齐、更易读。











