构造函数应将方法定义在 prototype 上以实现共享,避免在构造函数内用 this.方法名 = function() 重复创建;实例自动通过 proto 链接 prototype,属性查找优先实例自身,其次原型链,支持多层继承。

构造函数通过把方法挂到 prototype 上,让所有实例自动共享同一份函数代码,而不是每次 new 都重新创建一份。
把方法定义在 prototype 上,而非构造函数内部
构造函数内部用 this.方法名 = function(){},会导致每个实例都拥有独立副本,浪费内存。正确做法是把不变的方法统一写在构造函数的 prototype 属性上:
- 错误写法(重复创建):
function Person(name) { this.name = name; this.say = function() { console.log(this.name); } } - 正确写法(共享一份):
function Person(name) { this.name = name; }<br>Person.prototype.say = function() { console.log(this.name); }; - 验证方式:
new Person('a').say === new Person('b').say返回true,说明两个实例调用的是同一个函数对象
实例自动连接原型,无需手动设置
每次用 new 创建实例时,JS 引擎会自动把新对象的 __proto__ 指向构造函数的 prototype。这个链接是隐式完成的:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
const p = new Person('Tom');-
p.__proto__ === Person.prototype→true - 调用
p.say()时,引擎按p → p.__proto__ → Person.prototype的路径查找并执行
属性查找有优先级,实例属性会遮蔽原型方法
当实例自身有同名属性或方法时,它会“挡住”原型上的同名成员,优先使用自己的:
- 如果执行
p.say = function() { console.log('own'); },再调p.say()就不会走原型链 - 想临时绕过实例、强制调原型方法,可用:
Person.prototype.say.call(p) - 删掉实例方法后,原型方法自然生效:
delete p.say;再调p.say()就恢复从原型链查找
原型链支持多层复用,不只是单级共享
原型本身也是对象,它也有自己的 __proto__,可以继续向上链接:
-
Person.prototype.__proto__ === Object.prototype是成立的 - 所以
p.toString()虽然没定义在Person.prototype,但能沿链找到Object.prototype.toString - 这种层级结构是实现继承、兜底行为和框架内部方法共享的基础
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










