为什么组件内可以访问Vue.prototype上的属性?

测试代码

<div id="app">
  <comp1></comp1>
</div>
<script>
const Com = Vue.component('comp1',{
  template: '<div>com1</div>',
  created () {
    console.log(this.a) // 为什么可以访问a
  },
})
  
Vue.prototype.a = 1

vm = new Vue({
  el: '#app',
  data: {
    abc: 123
  }
})

console.log(vm)

有如下3个问题:

  1. Com是什么?
  2. vm是什么?
  3. 为什么在子组件内部可以访问this.a?

答:

  1. Com是一个构造器(一个函数)
  2. Vue.component() 返回一个构造器。Vue.component是通过 src/core/global-api/assets.js 中的initAssetRegisters 循环添加的方法。
    下面给出了部分伪代码:
Vue.component = function(option) {
  // this.options._base === Vue 调用Vue.extend
  definition = this.options._base.extend(definition)
  return definition
}

Vue.extend = function () {
  const Sub = function VueComponent (options) {
    this._init(options)
  }
  // Sub.prototype =  new Super()
  // Object.create(Super.prototype)在不是很严谨的情况下,可以等价于 new Super()。只不过如果Super这个构造函数中有一些代码的话,Object.create()并不会执行它们。
  Sub.prototype = Object.create(Super.prototype)
  Sub.prototype.constructor = Sub
  return Sub
}

这个构造器与Vue的关系是: Com.prototype.proto === Vue.prototype

如果再次通过 Com来创建某个实例c,即:

c = new Com()

则有 c.__proto_.__proto_ = Vue.prototype

综上,所有的vue 组件都可以通过原型链来访问Vue.prototype上的属性和方法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值