单例模式:
单例:单个实例
多次执行,只有一个对象,指,如果需要多次创建同一个对象,完成同一件事情,肯定会多次new,真的会产生多个对象,但是没必要。修改成,多次执行,只有一个对象
作用:
如果生成的实例化对象,属性,功能,方法都完全相同那么就生成的是同一个实例化对象
- 修改系统默认使用
function fn(){
// 将来准备给Fn的身上添加一个属性,这个属性为对象,但是又不能每次都添加
// 只有第一次添加,之后都不用添加
// 判断,如果是第一次,意味着之前没有添加过,默认是undefined,如果不是第一次,意味着之前添加过,那么就是对象
if(!fn.obj){
fn.obj = {}
}
fn.obj.sayHello = "hello";
return fn.obj;
}
var f1 = new fn();
var f2 = new fn();
console.log(f1);
console.log(f2);
console.log(f1 === f2); //t
- 利用封装实现
```javascript
// 需要一个构造函数
function Person(){
}
// 封装一个单例模式的调用方式
var f = (function(){
var instance;
return function(){
if(!instance){
instance = new Person();
}
return instance;
}
})();
var p1 = f();
var p2 = f();
console.log(p1);
console.log(p2);
console.log(p1 === p2); //t
应用:给页面创建一个信息框,每次执行,设置新内容,(信息框只有一个,只是内容在改)
//这个构造函数的功能就是创建一个div,添加到页面上
function Msg(){
this.ele = document.createElement("div");
document.body.appendChild(this.ele);
}
Msg.prototype.init = function(str){
this.ele.innerHTML = str;
}
var singleCase = (function (){
var instance;
return function(text){
if(!instance){
instance = new Msg();
}
instance.init(text);
return instance;
}
})();
var n1 = singleCase("哈哈哈"); //第一次的时候,页面中会出现一个新的div,内容是哈哈哈
var n2 = singleCase("嘿嘿嘿"); //第二次的时候,不会出现新的div,而是把原来的div变成嘿嘿嘿
console.log(n1 === n2); //t