原型对象本身不实现单例模式,关键需结合闭包缓存实例并在构造函数中返回该实例;所有new调用均指向同一对象,prototype仅负责方法复用。

原型对象本身不直接实现单例模式,因为 prototype 是函数的属性,用于共享方法和属性,它不是实例,也不控制实例创建逻辑。但你可以**结合原型链 + 实例缓存机制**,让基于某个构造函数创建的所有“实例”实际指向同一个对象,从而达到单例效果。关键不在 prototype 上做文章,而是在实例化环节拦截并复用。
用原型配合闭包缓存实例(推荐)
把实例存在闭包中,构造函数内部检查并返回已有实例;原型上的方法仍可正常使用,只是所有“new”调用都返回同一对象:
- 定义一个 IIFE 封装私有
instance - 构造函数里不真正创建新对象,而是返回缓存的 instance
- 把业务方法挂载到 prototype 上,确保复用的实例能访问这些方法
示例:
```jsconst Logger = (function () {
let instance;
function Logger() {
if (instance) return instance;
instance = this;
}
Logger.prototype.log = function (msg) {
console.log(`[LOG] ${msg}`);
};
Logger.prototype.error = function (msg) {
console.error(`[ERROR] ${msg}`);
};
return Logger;
})();
// 使用
const a = new Logger();
const b = new Logger();
console.log(a === b); // true
a.log('start'); // [LOG] start
b.error('fail'); // [ERROR] fail
```
注意:prototype 不负责唯一性,只负责方法复用
原型对象的作用是节省内存、共享行为,它不参与实例创建控制。即使你把方法写在 prototype 上,如果每次 new Logger() 都生成新对象,那还是多个实例。所以必须在构造函数执行时干预——要么返回已有对象,要么阻止重复初始化。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 单纯往
Logger.prototype加方法 ≠ 单例 - 必须配合实例缓存(闭包 / static 属性 / 模块变量)
- 构造函数内
return instance是关键一步,它会覆盖 new 的默认返回值
更安全的写法:避免误用 new,改用 getInstance
依赖 new + 构造函数返回 instance 虽然可行,但容易被忽略或误调(比如忘记检查 this instanceof Logger)。更清晰的做法是把构造逻辑完全收口:
- 把构造函数设为私有(仅 IIFE 内部调用)
- 暴露
getInstance()方法作为唯一入口 - 原型方法仍可挂在内部构造函数上,实例自然继承
这样既保留原型链优势,又彻底杜绝多实例风险。

















