我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue中methods的this指向问题浅析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue中methods的this指向问题浅析

如果是组件的话,将会是VueComponent实例对象,Vue和VueComponent两个类其实差不都,今后会另外开章节描述两者差别,这里先飘过。

比如下面的简单的一个demo代码,点击按钮打印出this。

<!DOCTYPE html>
<html lang="en">
  <head>
    <script class="lazy" data-src="../../dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <button @click="printThis">What is this</button>
    </div>
    <script>
      const vm = new Vue({
        el: "#app",
        data: {
          counter: 0,
        },
        methods: {
          printThis() {
            console.log("this:", this);
          },
        },
      });
    </script>
  </body>
</html>

最终打印的结果将会如下:

很明显,vue框架通过某种方法自动帮我们将methods下面的this指向到vue的实例对象了。

下面跟踪下vue的源代码,看下是怎么实现的。

首先,我们看下new Vue的入口,也即是Vue类的构造函数

function Vue(options) {
  ...
  this._init(options);
}

构造函数的参数options就是我们前面new Vue时传入的带有methods和data这些配置项的对象。

构造函数里面会做很多初始化的动作,这些动作都被封装到_init这个方法中了。因为是通过this调用的,所以我们可以猜想到这个方法应该是写到了Vue的prototype上的。

Vue.prototype._init = function (options?: Object) {
    const vm: Component = this;
    ...
    // 将含有methods和data等配置项的对象合并并挂到Vue实例对象vm的$options属性上
    if (options && options._isComponent) {
      // optimize internal component instantiation
      // since dynamic options merging is pretty slow, and none of the
      // internal component options needs special treatment.
      initInternalComponent(vm, options);
    } else {
      vm.$options = mergeOptions(
        resolveConstructorOptions(vm.constructor),
        options || {},
        vm
      );
    ...
    initState(vm);
    ...
  };
}

该方法会将我们new Vue时提供的带有methods和data的配置项放入到Vue实例对象的$options属性中,然后调用initState方法。

export function initState(vm: Component) {
  ...
  if (vm.$options.methods) initMethods(vm, vm.$options.methods);
  ...
}

因为我们提供了methods选项,记得吧?我们上面methods写了printThis方法。所以这里会调用到initMethods方法,传入的参数是Vue实例对象vm和我们传进来的methods选项。

function initMethods(vm: Component, methods: Object) {
  ...
  for (const key in methods) {
    ...
    vm[key] =
      typeof methods[key] !== "function" ? noop : bind(methods[key], vm);
  }
}

上面的代码逻辑主要就是循环methods里面的每个方法,然后将这些方法以相同的名字在vue实例对象中也放一份,比如我们的printThis方法,在vue实例对象中也来一份。

但是放到vue实例对象中的这些方法和原来的有一些区别,什么区别呢?就是通过上面的bind方法做了些调整。

这个bind方法看上去是不是很眼熟,名字和我们javascript用来修改this指向的bind方法一样。

而事实上这个bind方法最终调用的是一个叫做nativeBind的方法

function nativeBind (fn: Function, ctx: Object): Function {
  return fn.bind(ctx)
}

该方法做的事情就是将我们传入来的method,即我们这里的printThis方法的this的指向,指向到了传进来的vm,即我们的vue实例对象。

而这,也即是为什么我们在methods里面的方法可以通过this直接访问到Vue实例对象的原因了。

到此这篇关于Vue中methods的this指向问题浅析的文章就介绍到这了,更多相关Vue methods内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue中methods的this指向问题浅析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue中methods的this指向问题浅析

相信我们写Vue代码时肯定都会在methods中用过this这个关键字,甚至还打印过this查看其内容。最终发现该实例对象竟然是我们的Vue实例对象
2022-11-13

JavaScript中this指向问题的示例分析

这篇文章将为大家详细讲解有关JavaScript中this指向问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 箭头函数箭头函数排在第一个是因为它的 this 不会被改变,所以只要当前函数
2023-06-14

JavaScriptthis绑定与this指向问题的解析

本文主要介绍了JavaScriptthis绑定与this指向问题的解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-27

Vue props传入function时的this指向问题解读

这篇文章主要介绍了Vue props传入function时的this指向问题解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

一文搞懂JavaScript中的this指向问题

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于this指向的相关问题,this的意思是“这个、当前”,是一个指针型变量,它动态指向当前函数的运行环境,下面一起来看一下,希望对大家有帮助。
2023-05-14

一文详解JavaScript中this指向的问题

JavaScript中this指向的问题是面试中常常会问到的,所以本文就来通过一些简单的示例为大家详细讲讲,文中的示例代码讲解详细,需要的可以参考一下
2023-05-14

JavaScript中的this指向问题怎么解决

这篇文章主要介绍了一文搞懂JavaScript中的this指向问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇一文搞懂JavaScript中的this指向问题文章都会有所收获,下面我们一起来看看吧。this的
2023-07-04

JavaScript中this指向的问题怎么解决

今天小编给大家分享一下JavaScript中this指向的问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 默
2023-07-05

浅析Linux中重定向问题

简介在计算领域,重定向是大多数命令行解释器所具有的功能,包括各种可以将标准流重定向用户规定地点的Unix shells。类Unix操作系统的程序可以通过dup2系统调用完成重定向,或者通过缺少一些灵活性但是更高一级层次的freopen(3)
2022-06-04

编程热搜

目录