显式原型(prototype)是构造函数的属性,用于定义实例共享的方法和属性;隐式原型(__proto__)是实例的内部属性,指向其构造函数的prototype,构成原型链查找机制。

构造函数的显式原型(prototype)和实例的隐式原型(__proto__)是原型链的两个关键角色,作用不同、归属不同、使用场景也不同。
显式原型是函数的属性,用于定义共享行为
每个函数(包括构造函数)一创建,就自带一个 prototype 属性。它是一个普通对象,初始只含 constructor 指向自身,开发者可往里面添加方法或属性,供所有实例复用。
-
Person.prototype是函数Person的显式原型,属于函数本身 - 它不是实例的一部分,也不随实例创建而生成,而是函数诞生时就存在
- 添加到
prototype上的方法(如sayHello),会被所有new Person()实例通过原型链访问到
隐式原型是实例的内部链接,指向其构造来源
每个对象(包括构造函数创建的实例)都有一个 __proto__ 属性(即内部 [[Prototype]]),它在实例化时自动设置,值等于该实例所用构造函数的 prototype。
-
john.__proto__是实例john的隐式原型,属于该对象自身 - 它不可手动赋值(ES6 后更推荐用
Object.getPrototypeOf(john)读取) - 它的唯一作用是形成向上查找的链路:当访问
john.sayHello时,若实例上没有,就顺着__proto__去Person.prototype找
两者关系是“指向一致”,但本质不同
虽然 john.__proto__ === Person.prototype 为真,但这只是值相等,不是同一概念:
-
prototype是函数才有的显式设计接口,面向开发者扩展 -
__proto__是每个对象都有的隐式继承通道,面向引擎运行时查找 - 函数本身也是对象,所以它也有
__proto__(指向Function.prototype),但它没有prototype的情况极少(除箭头函数等非构造函数外)
常见误区提醒
不要混淆“谁有这个属性”和“它指向谁”:
- 只有函数有
prototype;所有对象(包括函数)都有__proto__ -
Object.prototype.__proto__是null,这是整个原型链的终点 - 修改
__proto__虽然可行,但性能差、不标准,应避免直接操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











