单例模式定义
保证一个类只有一个实例,并提供一个访问它的全局访问点。
一个普通的函数
function getSum() {
return (1 + 100) * 50
}
console.log(getSum()) // 5050
console.log(getSum()) // 5050
console.log(getSum()) // 5050
这个函数每次执行都会重新运算。我们可以这样优化:
优化后的函数
我们使用result储存结果,这样就不需要每次都计算了。
let result;
function getSum() {
if (result) {
return result
}
result = (1 + 100) * 50;
return result;
}
console.log(getSum()) // 5050
console.log(getSum()) // 5050
console.log(getSum()) // 5050
但是出现了两个变量result、getSum。还是会污染全局。我们继续优化:
再次优化(也叫惰性函数)
利用闭包+自执行函数,把result闭包在getSum中。这样就完美了。
const getSum = (function() {
let result;
function getSum() {
if (result) {
return result
}
result = (1 + 100) * 50;
return result;
}
return getSum;
})()
console.log(getSum()) // 5050
console.log(getSum()) // 5050
console.log(getSum()) // 5050
单例在类中的实践
GetSum是类,proxyGetSum是代理函数,通过proxyGetSum让GetSum只调回一次。
class GetSum{
constructor() {
this.result;
}
getSum() {
if (this.result) {
return this.result
}
this.result = (1 + 100) * 50;
return this.result;
}
}
const proxyGetSum = (function() {
let result;
function getInstance() {
if (result) {
return result
}
result = new GetSum();
return result;
}
return getInstance;
})()
const instance1 = proxyGetSum();
const instance2 = proxyGetSum();
console.log(instance1 === instance2) // true
总结
看似很简单,但是单例模式对性能优化作用很大。对代码的运行提升很大。