target和this的区别

本文深入解析JavaScript事件对象的属性和方法,重点区分e.target与this的不同。通过实例演示,解释了当点击页面元素时,e.target如何准确返回触发事件的具体元素,而this则指向绑定事件的元素。此外,还介绍了currentTarget属性及其与this的区别。

区别 : e.target 点击了那个元素,就返回那个元素 this 那个元素绑定了这个点击事件,那么就返回谁

<body>
    <div>123</div>
    <ul>
        <li>abc</li>
        <li>abc</li>
        <li>abc</li>
    </ul>
    <script>
        // 常见事件对象的属性和方法
        // 1. e.target 返回的是触发事件的对象(元素)  this 返回的是绑定事件的对象(元素)
        // 区别 : e.target 点击了那个元素,就返回那个元素 this 那个元素绑定了这个点击事件,那么就返回谁
        var div = document.querySelector('div');
        div.addEventListener('click', function(e) {
            console.log(e.target);
            console.log(this);

        })
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(e) {
                // 我们给ul 绑定了事件  那么this 就指向ul  
                console.log(this);
                console.log(e.currentTarget);

                // e.target 指向我们点击的那个对象 谁触发了这个事件 我们点击的是li e.target 指向的就是li
                console.log(e.target);

            })
            // 了解兼容性
            // div.onclick = function(e) {
            //     e = e || window.event;
            //     var target = e.target || e.srcElement;
            //     console.log(target);

        // }
        // 2. 了解 跟 this 有个非常相似的属性 currentTarget  ie678不认识
    </script>
</body>
在Vue.js的响应式原理中,`Dep.target = this;` 这行代码起着关键作用。下面详细解释其含义用途。 ### 含义 `Dep` 是一个依赖收集类,`target` 是 `Dep` 类的一个静态属性,它的作用是存储当前正在进行依赖收集的Watcher实例。`this` 通常指的是当前的Watcher实例。所以 `Dep.target = this;` 的含义是将当前的Watcher实例赋值给 `Dep` 类的 `target` 属性,这样在后续的数据劫持过程中,就可以通过 `Dep.target` 来知道当前正在收集依赖的是哪个Watcher实例。 ### 用途 在Vue的响应式系统中,当一个Vue实例创建时,Vue会遍历data选项中的所有属性,使用 `Object.defineProperty()` 方法将这些属性转换为 `getter/setter`。当这些属性的值被读取时,会触发 `getter` 方法,在 `getter` 方法中会进行依赖收集。而 `Dep.target = this;` 这行代码就是为依赖收集做准备的。 下面是一个简化的示例代码,帮助理解: ```javascript // Dep类,用于依赖收集 class Dep { static target = null; constructor() { this.subs = []; } depend() { if (Dep.target) { this.subs.push(Dep.target); } } notify() { this.subs.forEach(sub => sub.update()); } } // Watcher类,用于更新视图 class Watcher { constructor() { Dep.target = this; // 模拟读取数据,触发getter进行依赖收集 this.value = this.get(); Dep.target = null; } get() { // 模拟读取数据 let value = data.name; return value; } update() { console.log('数据更新,更新视图'); } } // 模拟Vue的响应式数据 let data = { name: 'John' }; // 对数据进行劫持 function defineReactive(obj, key, val) { const dep = new Dep(); Object.defineProperty(obj, key, { get() { dep.depend(); return val; }, set(newVal) { if (newVal !== val) { val = newVal; dep.notify(); } } }); } defineReactive(data, 'name', 'John'); // 创建Watcher实例 new Watcher(); // 修改数据,触发更新 data.name = 'Jane'; ``` 在上述代码中,当创建 `Watcher` 实例时,`Dep.target = this;` 将当前的 `Watcher` 实例赋值给 `Dep.target`,然后在 `get()` 方法中读取数据,触发 `getter`,在 `getter` 中调用 `dep.depend()` 方法进行依赖收集,将 `Dep.target` (即当前的 `Watcher` 实例)添加到 `Dep` 实例的 `subs` 数组中。当数据发生变化时,会触发 `setter` 方法,在 `setter` 方法中调用 `dep.notify()` 方法通知所有的 `Watcher` 实例进行更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值