1. 系統中被唯一使用
2. 一個類只有一個實例

```
class SingleObject {
login() {
console.log('login...')
}
}
SingleObject.getInstance = (function () {
// 閉包
let instance
return function () {
if (!instance) {
instance = new SingleObject();
}
return instance
}
})()
// 測試
let obj1 = SingleObject.getInstance()
obj1.login()
let obj2 = SingleObject.getInstance()
obj2.login()
console.log(obj1 === obj2) //true,一樣,所以叫單例模式
let obj3 = new SingleObject();
obj3.login();
console.log('obj1 === obj3',obj1===obj3) //false
```
```
class LoginForm {
constructor() {
this.state = 'hide'
}
show() {
if (this.state === 'show') {
alert('已經顯示')
return
}
this.state = 'show'
console.log('登錄框已顯示')
}
hide() {
if (this.state === 'hide') {
alert('已經隱藏')
return
}
this.state = 'hide'
console.log('登錄框已隱藏')
}
}
LoginForm.getInstance = (function () {
let instance
return function () {
if (!instance) {
instance = new LoginForm();
}
return instance
}
})()
// 一個頁面中調用登錄框
let login1 = LoginForm.getInstance()
login1.show()
// login1.hide()
// 另一個頁面中調用登錄框
let login2 = LoginForm.getInstance()
login2.show()
// 兩者是否相等
console.log('login1 === login2', login1 === login2) //true
```