JavaScript设计模式(代理模式)

1. 代理模式的定义

代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。

class Goole{
    constructor() {    }
    get() {
        return 'google';
    }
}

class Proxy {
    constructor() {
        this.google=new Goole();
    }
    get() {
        return this.google.get();
    }
}

2. 场景

2.1 虚拟代理实现图片预加载

const myImage = (function(){
    const imgNode = document.createElement( 'img' ); 
    document.body.appendChild( imgNode );

    return {
        setSrc: function( src ){ 
            imgNode.src = src;
        }
    }
})();

const proxyImage = (function(){
    const img = new Image;
    img.onload = function(){
        myImage.setSrc( this.src );
    }
    return {
        setSrc: function( src ){
            myImage.setSrc( 'file:// /C:/Users/svenzeng/Desktop/loading.gif' ); 
            img.src = src;
        }
    }
})();

proxyImage.setSrc( 'http:// imgcache.qq.com/music/photo/k/000GGDys0yA0Nk.jpg' );

2.2 事件委托

<body>
    <ul id="list">
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
<script>
  let list = document.querySelector('#list');
  list.addEventListener('click',event=>{
       alert(event.target.innerHTML);
  });     
</script>    
</body>

2.3 使用Proxy双向绑定

function bindHTMLContentWithObject(el, obj = {}) {
    let str = el.innerHTML;

    update();

    function update() {
        el.innerHTML = str.replace(/\{([^}]+)\}/g, function () {
            return obj[arguments[1]]
        });
    }

    let temp = {
        get(target, key) {
            if (typeof target[key] === 'object') return new Proxy(obj, temp)
            return Reflect.get(target, key);
        },
        set(target, key, value) {
            update();
            return Reflect.set(target, key, value);
        }
    }

    return new Proxy(obj, temp);

}

2.4 虚拟代理合并 HTTP 请求

const synchronousFile = function (id) {
    console.log('开始同步文件,id为: ' + id);
};

const proxySynchronousFile = (function () {
    let cache = [], // 保存一段时间内需要同步的 ID 
        timer;    // 定时器

    return function (id) {
        cache.push(id);
        if (timer) {    // 保证不会覆盖已经启动的定时器 
            return;
        }

        timer = setTimeout(function () {
            synchronousFile(cache.join(',')); // 2 秒后向本体发送需要同步的 ID集合 
            clearTimeout(timer);    // 清空定时器
            timer = null;
            cache.length = 0; // 清空 ID集合
        }, 2000);
    }
})();

const checkbox = document.getElementsByTagName('input');

for (let i = 0, c; c = checkbox[i++];) {
    c.onclick = function () {
        if (this.checked === true) {
            proxySynchronousFile(this.id);
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容