prototype是函数的显式原型属性,__proto__是对象的隐式原型链接;new实例时__proto__指向构造函数的prototype,实现继承查找。

prototype 是函数的属性,__proto__ 是对象的内部链接。它们不是同一个东西,但通过 new 创建实例时被明确关联起来。
prototype 只属于函数
每个函数(包括构造函数、class、箭头函数除外)一创建,就自动拥有一个 prototype 属性,它是一个普通对象,也叫“显式原型”。这个对象默认带一个 constructor 属性,指向该函数本身。
-
function Person() {}→Person.prototype存在,且是对象 -
class Animal {}→Animal.prototype同样存在(class 本质还是函数) -
const fn = () => {}→fn.prototype是undefined(箭头函数没有 prototype)
__proto__ 属于所有对象(除 null)
每个对象(包括函数、数组、字面量对象等)都有一个内部属性 [[Prototype]],浏览器中通常暴露为 __proto__,它指向该对象的“隐式原型”——也就是它的继承源头。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
let obj = {}→obj.__proto__ === Object.prototype -
let arr = []→arr.__proto__ === Array.prototype -
let p = new Person()→p.__proto__ === Person.prototype
关键关系:new 操作符建立连接
当你用 new Fn() 创建实例时,JavaScript 引擎会把新对象的 __proto__ 自动设为 Fn.prototype。这就是两者最核心的绑定逻辑。
function Dog(name) { this.name = name; }Dog.prototype.bark = function() { console.log('汪!'); };const dog1 = new Dog('旺财');- 此时:
dog1.__proto__ === Dog.prototype为true - 所以
dog1.bark()能执行 —— 查找路径:自身 × →__proto__(即Dog.prototype)✓
注意几个常见误区
不是所有对象的 __proto__ 都等于某个函数的 prototype;比如:
-
let o = Object.create({x: 1});→o.__proto__ === {x: 1}(直接指定原型,不经过函数) -
let a = {};→a.__proto__ === Object.prototype,而Object.prototype本身没有prototype属性(它是个普通对象) - 函数也是对象,所以函数也有
__proto__:例如Person.__proto__ === Function.prototype
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










