prototype的核心作用是让多个实例共用同一份方法和属性定义,避免重复创建、节省内存,并构成javascript继承的底层基础;它是构造函数的共享仓库,实例通过__proto__链访问其上的属性和方法。

原型对象 prototype 的核心作用,是让多个实例**共用同一份方法和属性定义**,避免重复创建、节省内存,同时构成 JavaScript 继承的底层基础。
prototype 是构造函数的“共享仓库”
每个函数(包括构造函数)一创建,就自带一个 prototype 属性,它指向一个普通对象。这个对象不是给构造函数自己用的,而是为将来所有通过 new 创建的实例服务的。
- 你把方法写在
Person.prototype.sayHello = function(){...}上,所有new Person()出来的对象都能调用sayHello,但内存里只存一份函数体 - 如果写在构造函数内部(
this.sayHello = function(){...}),每个实例都会各自拷贝一份,浪费资源 -
prototype上的属性和方法,对实例来说是“可读可调用”,但默认不可枚举(不影响for...in遍历)
__proto__ 是实例通往 prototype 的桥梁
每个实例对象都有一个隐式原型 __proto__(规范中叫 [[Prototype]]),它自动指向其构造函数的 prototype 对象。
-
const p = new Person();→p.__proto__ === Person.prototype为 true - 访问
p.sayHello()时,JS 先查p自身有没有,没有就顺着__proto__找到Person.prototype,再找方法 - 可以用
Object.getPrototypeOf(p)替代p.__proto__,更标准
constructor 属性维持“回溯关系”
每个 prototype 对象天生带一个 constructor 属性,值就是对应的构造函数本身。
-
Person.prototype.constructor === Person为 true - 这个链接让实例能“认出”自己的构造函数,比如用于类型判断或新建同类对象
- 手动重写整个
prototype时(如Person.prototype = {...}),记得补上constructor: Person,否则会丢失
原型链最终落在 Object.prototype 和 null
原型不是孤立的,而是一条向上的链条:实例 → 构造函数 prototype → Object.prototype → null。
Person.prototype.__proto__ === Object.prototype-
Object.prototype.__proto__ === null,这是整条链的终点 - 像
toString()、hasOwnProperty()这些通用方法,其实都来自Object.prototype,所以几乎所有对象都能用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











