1.3 子类构造器

选项校验介绍完后,在正式进入合并策略之前,还需要先了解一个东西,子类构造器。在vue的应用实例中,我们通过Vue.extend({ template: '<div></div>', data: function() {} })创建一个子类,这个子类和Vue实例创建的父类一样,可以通过创建实例并挂载到具体的一个元素上。具体用法详见Vue官方文档,而具体实现如下所示(只简单抽取部分代码):

  1. Vue.extend = function (extendOptions) {
  2. extendOptions = extendOptions || {};
  3. var Super = this;
  4. var name = extendOptions.name || Super.options.name;
  5. if (name) {
  6. validateComponentName(name); // 校验子类的名称是否符合规范
  7. }
  8. var Sub = function VueComponent (options) { // 子类构造器
  9. this._init(options);
  10. };
  11. Sub.prototype = Object.create(Super.prototype); // 子类继承于父类
  12. Sub.prototype.constructor = Sub;
  13. Sub.cid = cid++;
  14. // 子类和父类构造器的配置选项进行合并
  15. Sub.options = mergeOptions(
  16. Super.options,
  17. extendOptions
  18. );
  19. return Sub // 返回子类构造函数
  20. };

为什么要先介绍子类构造器的概念呢,原因是在选项合并的代码中,除了需要合并Vue实例和Vue构造器自身的配置,还需要合并子类构造器和父类构造器选项的场景。