原型链通过将方法挂载到构造函数的prototype上实现共享,避免每个实例重复创建函数;不可变值可放原型,可变引用类型必须在构造函数中初始化;es6 class本质仍是原型链,原型链越短性能越好。

原型链本身不直接“解决”内存占用,它的价值在于为方法共享提供了天然、安全、高效的底层机制——把函数放对地方,就能让成百上千个实例共用同一份代码,彻底避免重复创建。
方法挂原型上,一份代码服务所有实例
每次 new 一个对象时,如果在构造函数里写 this.say = function() {...},每个实例都会生成一个独立的函数对象。100 个实例就是 100 份完全相同的函数,纯属冗余。
✅ 正确做法是统一挂到构造函数的 prototype 上:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
Person.prototype.say = function() { console.log(this.name); };- 所有
new Person()实例的say都指向同一个函数引用 - 验证很简单:
a.say === b.say返回 true
避开可变引用类型这个大坑
原型适合放函数和不可变值(如 Person.prototype.species = 'Homo sapiens'),但绝不能放数组、对象这类可变引用类型。
- ❌ 错误:
Person.prototype.hobbies = []→ 所有实例共用一个数组,一人push,全员受影响 - ✅ 正确:把可变状态放在构造函数里初始化,如
this.hobbies = []; - 这样既保证了方法共享,又隔离了实例数据
现代写法更省心,原理没变
ES6 的 class 语法只是封装了原型操作:
-
class Person { say() { ... } }编译后,say依然落在Person.prototype上 - 自动维护
constructor,不易漏掉或写错 - 本质仍是原型链,只是写法更直观、容错性更高
原型链越短,访问越快
虽然原型链核心作用是共享,但它也影响性能:
- 属性查找要逐层向上,链越长,开销越大
- 高频读取的属性(如循环中反复用的
id)可缓存到实例自身:this._id = this.id; - 避免运行时修改原型(如增删属性),否则 V8 的内联缓存可能失效,反而拖慢整体执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










