JavaScript原型链是对象通过__proto__按需向上委托查找属性的单向路径,终点为Object.prototype.__proto__ === null;构造函数的prototype属性用于连接实例与共享原型,继承即拼接原型链。

JavaScript 中原型链的核心,就是对象通过 __proto__ 一层层向上查找属性和方法的机制——它不复制,只委托;不预建,只按需查找。
属性查找从自身开始,失败才启动向上跳转
每次访问 obj.prop,引擎第一件事是检查 obj 自身是否含有该属性(包括不可枚举属性)。只要存在,立刻返回,根本不会碰 __proto__。只有查不到时,才会读取 obj.__proto__,把查找目标切换到那个对象上。
-
__proto__是对象内部[[Prototype]]的非标准但广泛支持的访问方式 - 更推荐用
Object.getPrototypeOf(obj)获取原型,语义清晰且符合规范 - 这个链接是单向、只读的(除非显式调用
Object.setPrototypeOf(),但应避免)
原型链是一条“用时才走”的单向路径,终点明确
查找不是一次性构建整条链,而是边找边跳:没找到 → 跳到 __proto__ 指向的对象 → 再没找到 → 继续跳它的 __proto__……直到抵达 Object.prototype。而 Object.prototype.__proto__ 的值是 null,这就是链的终止信号。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 数组
[1,2]的原型链是:[1,2] → Array.prototype → Object.prototype → null - 函数
function f(){}的原型链是:f → Function.prototype → Object.prototype → null - 所有普通对象最终都连到
Object.prototype,因此天然拥有toString、hasOwnProperty等方法
构造函数的 prototype 是搭建这条链的“连接器”
当你用 new Person() 创建实例时,JS 自动让该实例的 __proto__ 指向 Person.prototype。你往 Person.prototype 上添加方法,所有实例就能共享使用,因为它们共用同一条向上查找路径。
立即学习“Java免费学习笔记(深入)”;
-
prototype属于函数,是给实例准备的“共享原型对象” -
__proto__属于对象,是实例通往原型的“隐式通道” - 普通字面量对象(如
{})没有prototype属性,但一定有__proto__
继承的本质就是拼接原型链,让查找能跨对象进行
想让 Dog “继承” Animal 的方法,关键不是复制代码,而是让 Dog 实例的原型链中包含 Animal.prototype:
- 用
Dog.prototype = Object.create(Animal.prototype),使Dog.prototype.__proto__指向Animal.prototype - 补上
Dog.prototype.constructor = Dog,修复构造器引用 - 这样
new Dog()的链就变成:dog → Dog.prototype → Animal.prototype → Object.prototype → null - 调用
dog.eat()时,自身没有 → 找到Dog.prototype也没有 → 继续往上在Animal.prototype找到

















