定义
是能被实例化一次的类或者对象(只能存在一个)
特点
- 只允许实例化一次的对象类
- 对于十分复杂的对象类,往往可以节省资源占用
- 通常也被用来管理命名空间
作用
管理命名空间,管理数据,方法存储
应用
<a name="mNy9H"></a># 举例-单例模式_自定义弹出层```html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>单例模式_自定义弹出层</title><style>div.tip {width: 500px;height: fit-content;position: fixed;top: 0;left: 0;right: 0;bottom: 0;margin: auto;background-color: #fff;background-clip: padding-box;border-radius: 4px;box-shadow: 0 4px 12px rgb(0 0 0 / 15%);pointer-events: auto;display: none;}div.tip > .top {background-color: skyblue;padding: 16px 24px;color: rgba(0, 0, 0, 0.65);border-bottom: 1px solid #e8e8e8;border-radius: 4px 4px 0 0;line-height: 22px;}div.tip > .top > span {float: right;width: 20px;height: 20px;border-radius: 50%;cursor: pointer;background-color: #fff;font-size: 16px;text-align: center;line-height: 20px;}.tip > .content {padding: 24px;font-size: 14px;line-height: 1.5;word-wrap: break-word;}.tip > .btns {display: flex;justify-content: flex-end;padding: 10px 16px;background: transparent;border-top: 1px solid #e8e8e8;border-radius: 0 0 4px 4px;}</style></head><body><div class="tip"><div class="top">标题<span>X</span></div><div class="content"><p>提示内容</p></div><div class="btns"><button>取消</button><button>确定</button></div></div><script>const Tip = (() => {class Tip {constructor() {this.ele = document.createElement("div");this.ele.className = "tip";document.body.appendChild(this.ele);this.callback = () => {};this.bindEvent();}setContent(txt) {this.ele.innerHTML = `<div class="top">标题<span class="close">X</span></div><div class="content"><p>${txt}</p></div><div class="btns"><button class="cancel">取消</button><button class="ok">确定</button></div>`;this.ele.style.display = "block";}bindEvent() {this.ele.addEventListener("click", (e = window.event) => {const target = e.target || e.srcElement;const { className } = target;switch (className) {case "close":this.ele.style.display = "none";break;case "cancel":this.ele.style.display = "none";this.callback(false);break;case "ok":this.ele.style.display = "none";this.callback(true);break;}});}setStyle(val) {this.ele.querySelector(".top").style.backgroundColor = val;}}let instance = null;return function singleTon(options = {}, cb = function () {}) {const { txt = "Hello World", topBG = "skyblue" } = options;if (!instance) instance = new Tip();instance.setContent(txt);instance.setStyle(topBG);instance.callback = cb;return instance;};})();Tip({txt: "Hello World",topBG: "#1890ff",},(res) => {console.log("print: ", res);});</script></body></html>
