原型链查找路径为从实例自身→Labrador.prototype→Dog.prototype→Animal.prototype→Object.prototype→null,严格按此顺序向上逐级查找属性或方法。

多层继承时,原型链的查找路径就是一条清晰的“向上逐级询问”的路线:从实例对象自身开始,沿着每个对象的 [[Prototype]](即 __proto__ 或 Object.getPrototypeOf())一路往上,直到 null 为止。
查找路径的起点和终点很固定
无论继承几层,引擎查找属性或方法时都严格按这个顺序:
- 先查实例对象自身的属性(
hasOwnProperty能判断) - 没找到,就查它的
__proto__指向的对象(通常是构造函数的prototype) - 还没找到,就继续查那个对象的
__proto__ - 如此反复,最终停在
Object.prototype;它的__proto__是null,链终止
典型三层继承的链路示例
比如有 Animal → Dog → Labrador 的继承结构:
const Animal = function(name) { this.name = name; };
Animal.prototype.eat = function() { console.log("Eating"); };
const Dog = function(name, breed) {
Animal.call(this, name);
this.breed = breed;
};
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.bark = function() { console.log("Woof!"); };
const Labrador = function(name, breed, color) {
Dog.call(this, name, breed);
this.color = color;
};
Labrador.prototype = Object.create(Dog.prototype);
Labrador.prototype.fetch = function() { console.log("Fetching..."); };
此时一个 lab 实例的原型链是:
lab → Labrador.prototype → Dog.prototype → Animal.prototype → Object.prototype → null
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
调用 lab.eat() 时,引擎依次检查这六个位置,直到在 Animal.prototype 上命中。
关键细节决定链是否连通
多层继承容易断链,常见问题集中在三处:
-
Dog.prototype = Object.create(Animal.prototype)必须写,不能直接赋值空对象,否则跳过Animal层 - 每次重设
prototype后,记得补上constructor,避免lab.constructor指向错误构造器 - 用
class extends时,底层自动完成这些连接,但原理不变:子类prototype.__proto__指向父类prototype
快速验证链路的方法
在控制台里用这几行就能画出任意实例的完整链:
const lab = new Labrador("Max", "Retriever", "yellow");
console.log(lab.__proto__); // Labrador.prototype
console.log(Object.getPrototypeOf(lab.__proto__)); // Dog.prototype
console.log(Object.getPrototypeOf(Object.getPrototypeOf(lab.__proto__)));// Animal.prototype
console.log(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(lab.__proto__))));// Object.prototype
console.log(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(lab.__proto__))))); // null
每一步输出都是链上的一个节点,一目了然。










