javascript中通过prototype扩展公共方法可节省内存并实现方法共享:将共用函数挂载到构造函数prototype上,而非构造函数内部;实例调用时共享同一函数引用;扩展内置对象需谨慎以防冲突。

JavaScript 中通过 prototype 属性扩展公共方法,核心是把所有实例共用的函数统一挂到构造函数的 prototype 对象上,而不是在构造函数内部重复定义。这样既能节省内存,又能保证方法共享。
给构造函数的 prototype 添加方法
只要函数作为构造函数使用(配合 new),它的 prototype 就是所有实例的“共享池”。往里面加方法,每个实例都能调用:
-
正确写法:
function Person(name) { this.name = name; }<br>Person.prototype.say = function() { console.log('Hello, ' + this.name); }; - 创建两个实例:
const p1 = new Person('Alice'); const p2 = new Person('Bob'); - 调用时共用同一份函数:
p1.say === p2.say返回true。
避免在构造函数里定义方法
如果把方法写在构造函数体内,每次 new 都会新建一个函数对象,造成冗余:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
错误示例:
function Person(name) { this.name = name; this.say = function() { ... }; } - 这样
p1.say !== p2.say,且 100 个实例就占用 100 份内存。 - 只有不变、通用的行为才适合放在
prototype上。
扩展内置对象的方法(谨慎使用)
你也可以给 Array、String 等内置构造函数的 prototype 添加方法,让所有对应类型的实例可用:
- 例如给数组加求和方法:
Array.prototype.sum = function() { return this.reduce((a, b) => a + b, 0); }; - 之后
[1, 2, 3].sum()就能返回6。 - 注意:扩展原生对象有风险,可能与其他库冲突,生产环境建议慎用或封装成工具函数。
验证方法是否真正共享
可以通过比较函数引用或检查原型链来确认:
console.log(p1.say === p2.say); // trueconsole.log(p1.__proto__ === Person.prototype); // trueconsole.log(Person.prototype.hasOwnProperty('say')); // true
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










