通用的惰性单例-清华大学计算机考研经验贴.
4.6通用的惰性单例上一节我们完成了一个可用的惰性单例,但是我们发现它还有如下一些问题。 这段代码仍然是违反单一职责原则的,创建对象和管理单例的逻辑都放在createLoginLayer对象内部。 如果我们下次需要创建页面中唯一的iframe,或者script标签,用来跨域请求数据,就必须得如法炮制,把createLoginLayer函数几乎照抄一遍: var createIframe= (function(){ var iframe; return function(){ if ( !iframe){ iframe= document.createElement( 'iframe' ); iframe.style.display = 'none'; document.body.appendChild( iframe); } return iframe; } })();我们需要把不变的部分隔离出来,先不考虑创建一个div和创建一个iframe有多少差异,管理单例的逻辑其实是完全可以抽象出来的,这个逻辑始终是一样的:用一个变量来标志是否创建过对象,如果是,则在下次直接返回这个已经创建好的对象: var obj; if ( !obj ){ obj = xxx; }现在我们就把如何管理单例的逻辑从原来的代码中抽离出来,这些逻辑被封装在getSingle函数内部,创建对象的方法fn被当成参数动态传入getSingle函数: var getSingle = function( fn ){ var result; return function(){ return result || ( result = fn .apply(this, arguments ) ); } };接下来将用于创建登录浮窗的方法用参数fn的形式传入getSingle,我们不仅可以传入createLoginLayer,还能传入createScript、createIframe、createXhr等。之后再让getSingle返回一个新的函数,并且用一个变量result来保存fn的计算结果。result变量因为身在闭包中,它图灵社区会员bala233专享尊重版权
8.5MB
文件大小:
评论区