Vue和VueComponent(Vue组件)实例对象的内置关系

68 阅读1分钟

初始代码:

<body>
  <script src="../js/vue.js"></script>
      <div id="app"></div>
  <script>
      
    const school = Vue.extend({
      template:`
        <div>
        </div>
      `,
      data()
        return {}
      }
    })

  </script>
</body>

说明: 用Vue.extend()生成school对象就是VueComponent(Vue组件)的实例对象

从下面的调试信息我们可以知道:

console.log(school.__proto__ === Vue.__proto__); //true
console.log(school.prototype.__proto__ === Vue.prototype); //true

(1)school和Vue都是一个构造函数

(2)shcool的prototype是在Vue的prototype的基础上增加了某些内容

底层操作可理解为:

  1. 创建一个新对象,并赋予某些属性;再合并Vue.prototype对象(对象的合并为浅拷贝)

  2. 赋值操作:shcool.prototype = 上面创建的新对象

进一步调试说明1:

Vue.prototype.x = 99
console.log(school.prototype.x); //99
school.prototype.__proto__.x = 100
console.log(Vue.prototype.x); //100

以上代码可以看出两者为浅拷贝关系

进一步调试说明2:

console.log(school.prototype === Vue.prototype); //false

说明两个对象实际有差别

背景知识点补充:

引用自哔哩哔哩网站中《尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通》的P57:

关于VueComponent:

1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

2.我们只需要写或,Vue解析时会帮我们创建school组件的实例对象, 即Vue帮我们执行的:new VueComponent(options)。

3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!