// 根据blibli小野森森copy <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div class="btn"> <button data-status="S">点击成功 </button> <button data-status="W">点击告警</button> <button data-status="E">点击失败 </button> </div> <p id="text"><span class="sp"></span></p> <script> /** * 工厂模式 * 公共方法,属性,工具 **/ const ModalTypes = { "Success": "S", "Warning": "W", "Error": "E" } class MyModal { constructor(status) { this.status = status; } get className() { let classStr = 'modal'; switch(this.status){ case 'S': classStr += ' success'; break; case 'W': classStr += ' warning'; break; case 'E': classStr += ' error'; break; default: break; } console.log('classStr', classStr) return classStr; } static checkStatusIsExist(types,status) { for (let k in types) { if(types[k] == status) { return true } } return false } static outputInfo(info) { console.log(info) } } class SucessModal extends MyModal { constructor(title) { super('S') this.title = '成功'+ title; } goHome(url) { window.location.href = url; } } class WarningModal extends MyModal { constructor(title) { super('W') this.title = '告警'+title; } outputInfo(info) { MyModal.outputInfo('告警:'+ info) } } class ErrorModal extends MyModal { constructor(title) { super('E') this.title = '失败'+title; } outputInfo(err) { MyModal.outputInfo('失败:'+ err) } } class ModalFactory { constructor(dom) { this.dom = dom; } create(title, state) { const dom = this.dom; let modal = null; const statusIsExist = MyModal.checkStatusIsExist(ModalTypes, state); if(!statusIsExist) { throw new Error('No state'); } switch(state) { case 'S': console.log(title, state) modal = new SucessModal(title); break; case 'W': modal = new WarningModal(title); break; case 'E': modal = new ErrorModal(title); break; default: break; } // console.log(dom.getElementsByClassName('sp')[0], modal.title) dom.getElementsByClassName('sp')[0].innerText = modal.title; dom.className = modal.className; return { outputInfo: modal.outputInfo, goHome: modal.goHome } } } var txtDom = document.getElementById("text") var modalFactory = new ModalFactory(txtDom) ;(() => { let oBtnGroup = document.getElementsByClassName("btn")[0] const init = () => { bindEvent() } function bindEvent() { oBtnGroup.addEventListener("click",handBtnClick, false); } function handBtnClick(e) { const tag = e.target; const tagName = tag.tagName.toLowerCase(); if(tagName == 'button') { const status = tag.dataset.status; // modalFactory.create('test',status) // modalFactory.create('test',13) let modal = modalFactory.create('test',status) switch(status) { case "W": modal.outputInfo('这是一个告警'); break; case "E": modal.outputInfo('这是一个错误'); break; case "S": modal.goHome("http://www.baidu.com"); break; default: break; } } } init() })() </script> </body> </html>