委托模式

作者: 姜治宇 | 来源:发表于2020-04-17 22:19 被阅读0次

委托模式比较简单,我们先来看个垃圾代码,估计你以前也造过:

let ul = document.getElementById('cont')//外部容器

let li = document.getElementsByTagName('li')//列表

for(let i=0;i<li.length;i++){
    li[i].onclick = function(){
        this.style.backgroundColor = 'grey'
    }
}

为啥说这是一摊垃圾呢?
因为for循环将dom对象绑定了n个事件,这些事件的回调函数本身也是对象,会一下子吃掉好多堆内存空间,对性能来说是个很大的问题。
如何解决呢?
很简单,委托父元素。

let ul = document.getElementById('cont')//外部容器

ul.onclick = function (e) {
    let tar = e.target
    if (tar.nodeName.toLowerCase() === 'li') {
        tar.style.backgroundColor = 'grey'
    }
}

没错,就是利用利用事件流模型,从事件捕获开始,到触发该事件,然后再到事件冒泡三个阶段,我们可以将子元素的事件委托给更高层面的父元素来绑定执行,这就是体现了委托模式的思想。
下面再看一段垃圾代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>委托模式</title>
</head>
<body>
    <div id="cont">
        <button id="btn">click</button>
    </div>
</body>
</html>
<script>
    var btn = document.querySelector('#btn')
    btn.onclick = function(){
        document.querySelector('#cont').textContent = '替换了按钮'
    }
</script>

为什么是垃圾呢?
因为btn按钮被替换掉了,但是对btn绑定的onclick事件并未释放掉,这个回调函数仍然存在于堆内存中,时间久了就会出现内存泄露了。
我们可以用委托模式改造一下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>委托模式</title>
</head>
<body>
    <div id="cont">
        <button id="btn">click</button>
    </div>
</body>
</html>
<script>
    var cont = document.querySelector('#cont')

    cont.onclick = function(e){

        if(e.target.id === 'btn'){
            this.textContent = '替换了按钮'
        }

    }
</script>

相关文章

  • Kotlin学习之类与对象3

    委托 由委托实现 委托模式(https://zh.wikipedia.org/wiki/委托模式)已经证明是实现继...

  • 一文彻底搞懂Kotlin中的委托

    1. 什么是委托? 委托,也就是委托模式,它是23种经典设计模式种的一种,又名代理模式,在委托模式中,有2个对象参...

  • Kotlin | 委托(Delegation)详解

    本文要点概述 辨析委托模式与代理模式 接口委托(Delegated interface) 属性委托(Delegat...

  • Kotlin中的委托

    Kotlin中的委托 啥是委托 其实kotlin中的委托的理念就是委托模式也是叫做代理模式;在Kotlin中委托有...

  • Kotlin委托

    Kotlin委托 1.Kotlin中的委托有两种形式,一种是委托模式,一种是委托属性。 2.委托模式是设计模式中的...

  • 52个有效方法(23) - 通过委托与数据协议进行对象间的通信

    委托模式(Delegate pattern) 委托模式(Delegate pattern):用来实现对象间的通信 ...

  • 项目管理委托的模式和设计任务委托的模式

    知识点:【了解】项目管理委托的模式和设计任务委托的模式【掌握】项目总承包的模式 一、项目管理委托的模式★ 国际上业...

  • Kotlin中的类委托和属性委托

    Kotlin的委托可分为类委托和属性委托。 一、类委托 类委托是代理模式的应用,而代理模式可以作为继承的一个不错的...

  • delegate

    什么是 delegate delegate是委托模式.委托模式是将一件属于委托者做的事情,交给另外一个被委托者来处...

  • 委托模式

    总述 主要是自己不想做的事交给被委托的对象去做。 类图 实现 调用 效果 委托者 被委托者 双方的契约

网友评论

    本文标题:委托模式

    本文链接:https://www.haomeiwen.com/subject/ceuuvhtx.html