定义
保证一个特定类仅有一个实例。如果第二次使用同一个类创建新对象的时候,应该得到与第一次所创建对象完全相同的对象
补充知识
自执行函数
(function Fun(){
console.log('work!');
})();
// Output: work!
- 讲解
//相当于是先
let tmp = function Fun(){
console.log('work!');
}
//然后
tmp();
//Output: work!
就是把tmp换为声明的函数,省去了声明另一个变量的步奏。
arguments
ECMAScript函数中的参数在内部用一个对象来表示。函数接收的始终是这个对象,而不关系数组中所包含的参数(如果有参数的话)
function A(){
console.log(arguments);
}
A(1,2,3,4,5,6,7,8,9,10);
Output:
基本格式
'use strict';
let mySingleton = (function(){
//变量instance用于标记存放具体方法的init()函数是否被初始化,并在初始化后用于存放init()
let instance;
//方程init()内部填写具体实现方法,不希望对外暴露与修改的写在函数内部,可以被外部调用与修改的写在返回值中
function init() {
//函数privateMethod()不可被外部调用,为私有元素
function privateMethod() {
console.log('Private Method');
}
//变量privateVar的值不可被外获取与修改,为私有元素
let privateVar = 'Private var';
return {
//变量publicVar可被外部获取与修改
publicVar: 'Public publicVar',
//函数publicFunction可被外部获取与修改
publicFunction: function() {
console.log('Public Method');
}
};
}
return {
//此函数的作用为需要使用init()中具体方法时判断其是否被初始化
getInstance: function() {
if(instance === undefined){
//如果没有被初始化,则进行初始化
instance = init();
}
//返回存放具体方法的init()函数
return instance;
}
};
})();
//测试
let A = mySingleton.getInstance();
let B = mySingleton.getInstance();
console.log(A === B); //Output: true , 说明完全相同,符合定义:指向单一对象
console.log(A.publicVar); // Output: Public publicVar(可访问)
A.publicFunction(); //Output: Public Method(可访问)
A.privateMethod(); //Output: TypeError: A.privateMethod is not a function(不可访问)
console.log(A.privateVar);//Output: undefined(不可访问)