保证一个类仅有一个实例,并提供一个访问它的全局访问点。
利弊分析
优点:
缺点:
基本的单例模式,就是对象字面量
const SingleTon = { name:"tom", age"26", say(){ console.log("hello") }, eat(){ console.log("rice") } } //访问单例 SingleTon.gender = '男' SingleTon.say()
var GianCrop = {}; GianCrop.common = {}; GianCrop.errorCodes = {}; GianCrop.pageHandler = {};
GianCrop.dataParse = { //约定私有成员以_开头 _method1() {}, _method2() {}, _method3() {} //约定公共成员不以_开头 method1() {}, method2() {}, method3() {} };
// MyNameSpce.SingleTon = {} // 闭包单例模式 let MyNameSpce = {}; MyNameSpce.SingleTon = (function () { return { name: "tom", age: 26, say() { console.log("hello"); }, eat() { console.log("rice"); }, }; })(); const name = MyNameSpce.SingleTon.name; console.log("🚀 ~ name:", name);
增加私有成员
let MyNameSpce = {}; MyNameSpce.SingleTon = (function () { let isFlag = true; let count = 30; function getCount() { return count; } return { name: "tom", age: 26, say() { console.log("hello"); }, eat() { console.log("rice"); }, getFlag() { return isFlag; }, getCount, }; })(); const { name, getFlag, getCount } = MyNameSpce.SingleTon; console.log("🚀 ~ name:", name); console.log("🚀 ~ getFlag:", getFlag()); console.log("🚀 ~ getCount:", getCount()); /** * 🚀 ~ name: tom demo05.js:46 🚀 ~ getFlag: true demo05.js:47 🚀 ~ getCount: 30 */
let MyNameSpce1 = {}; MyNameSpce1.SingleTon = (function () { let singleTon = null; function init() { let isFlag = true; let count = 30; function getCount() { return count; } console.log("init-----------"); return { name: "tom", age: 26, say() { console.log("hello"); }, eat() { console.log("rice"); }, getFlag() { return isFlag; }, getCount, }; } return { getInstance() { if (!singleTon) { singleTon = init(); } return singleTon; }, }; })(); const demo = MyNameSpce1.SingleTon.getInstance(); const demo2 = MyNameSpce1.SingleTon.getInstance(); console.log(demo.name); console.log(demo2.name); //调用了两次实例,但是只初始化了一次 /** * * 🚀 ~ name: tom * 🚀 ~ getFlag: true 🚀 ~ getCount: 30 init----------- tom tom */
var SimpleXhrFactory = (function () { const standard = { createXhrObjec() { return new XMLHttpRequest(); }, }; const activeXNew = { createXhrObject() { return new ActiveXObject("Microsoft.XMLHTTP"); }, }; const activeOld = { createXhrObject() { return new ActiveXObject("Msxml2.XMLHTTP"); }, }; var testObject; try { testObject = standard.createXhrObject(); return standard; } catch (error) { try { testObject = activeXNew.createXhrObject(); return activeXNew; } catch (error) { try { testObject = activeOld.createXhrObject(); return activeOld; } catch (error) { throw new Error("can't create xhr object"); } } } })();