本回内容引见
上一回聊到JS中模仿接口,装潢者形式,掺元类,剖析了backbone的继续源码,以为还好吧!
介一回,偶们来聊一下在JS单例形式(singleton),单例形式实在应用很普遍,比方:jquery,AngularJS,underscore吖虾米的都是单例形式,来吧,直接最先咯:
1. 单例形式
保证一个类只要一个实例,从全局定名空间里供应一个唯一的接见点来接见该对象。实在之前写过的对象字面量也是一种简朴单例,以下:
var Singleton = {
name: "飞狐",
method: function () {
return 'hello world';
}
};
alert(Singleton.method()); // 返回hello world
这就是一个简朴单例了,应当许多盆友已看出来了,没有作用域,假如要扩大私有属性和要领的话,那末就能够靠闭包来完成。
2. 闭包单例形式
望文生义要用到闭包,作为返回实例对象,以下:
var Singleton = (function(){
var name = '飞狐'; // 私有属性
var nickname = '帅狐';
var showNickname = function(){ // 私有要领
return nickname;
}
return { // 返回一个对象
name:name, // 将私有属性公然
nickName: function(){ // 在公然的要领中返回私有要领
return showNickname();
}
}
})();
alert(Singleton.name); // 飞狐
alert(Singleton.nickName()); // 帅狐
这里我们接着上边儿简朴单例的例子来,轻微的改一下,改成闭包以后,就数据保证了不受外界滋扰了。
3. 惰性单例形式
惰性单例就是只要在运用的时刻才初始化,以下:
var Singleton = (function(){
var uniq; // 私有变量,用来寄存返回实例化对象的容器
function init(){ // 初始化要领
var buildeList = function(){ // 私有要领
// 下面这一堆就是建立一个有序列表,含有5个li
var root = document.createElement('ol');
document.body.appendChild(root);
for(var i=0;i<5;i++){
var a = document.createElement('a');
a.innerHTML = '<a>帅狐</a>';
var li = document.createElement('li');
li.appendChild(a);
root.appendChild(li);
}
}
return { // 一样的闭包,暴露共有要领
method:function(){
return buildeList();
}
};
}
return {
// 这里就是实例化对象了
getInstance:function(){
// 这里的uniq为true的时刻,或许能够写成 typeof uniq==='undefined'
if(!uniq){
// 建立单例实例
uniq = init();
}
return uniq;
}
};
})();
Singleton.getInstance().method(); // 返回1.帅狐2.帅狐3.帅狐4.帅狐5.帅狐
这个例子就是惰性单例了,也就是说只要在用的时刻才会去初始化要领,如许能够更省资本。
4. 分支单例形式
分支单例就很简朴了,就是做顺序分支的推断,应用分支来返回响应的实例,常常用于浏览器检测,直接看代码吧,以下:
var ua = window.navigator.userAgent.toLocaleLowerCase();
var matchedRE = /iphone|android|symbianos|windows\sphone/g;
var Singleton = (function() {
var webUrl = 'web端url';
var mobileUrl = '挪动端url';
return (matchedRE.test(ua))?mobileUrl:webUrl;
})();
// 假如是pc端返回就是web端url,假如是挪动端就返回挪动端url
alert(Singleton);
这个例子就是分支单例了,比较简朴,这个例子也是模仿京东现在推断接见装备的代码。
装个逼再说。刚看到一消息,韩雪发微博称,由于本身修正的本月套餐,上月流量就清零了,并称:“我改这个月的和上个月有什么关系吗?我付了钱的,过剩的流量凭什么你说清零就清零呢?这不是霸王条目吗?”,女神都忍耐不了了,哈哈~~
这一回讲的内容不多,就一个单例形式,
下面的内容更简朴,一道题。
5. 笔试题:推断字符串中涌现次数最多的字母,返回该字母及其涌现次数
function calculate(str){
//定名一个变量安排字母涌现的最高次数并初始化为0
var maxLength = 0;
//定名一个变量安排效果输入
var result = '';
//轮回迭代最先,并推断字符串是不是为空
while(str != '' ){
//将原始的字符串变量赋值给新变量
var oldStr = str;
//用字符串的substr的要领获得第一个字符(首字母)
var getStr = str.substr(0,1);
//实行一次全局替换
eval("str = str.replace(/"+getStr+"/g,'')");
//推断原始的字符串的长度减去替换后字符串长度是不是大于之前涌现的最大的字符串长度
if(oldStr.length-str.length > maxLength ) {
//两字符串长度相减获得最大的字符串长度
maxLength = oldStr.length-str.length;
//返回最大的字符串效果(字母、涌现次数)
result = "涌现最多的字母是:" + getStr + "------涌现了" + maxLength + " 次。";
}
}
return result;
}
var str ="adadfdfseffserfefsefseeffffftsdg";
alert(calculate(str));
这个题基本上我都写了解释,难度适中,当文娱消遣。
这一回,重要聊了单例形式,应当很好明白,难度不大。
下一回,咱重要聊一聊工场形式。
话说,看完文章以为ok,客观点个赞呗,好东西多引荐引荐,让人人都晓得,嘿嘿,彷佛有点那啥卖瓜了…
注:此系飞狐原创,转载请说明出处