美文网首页
解析 Vue.extend(extendOptions)

解析 Vue.extend(extendOptions)

作者: 冷暖自知_zjz | 来源:发表于2020-05-27 18:58 被阅读0次

    传入一个对象 返回一个继承自父类的构造函数(构造一个 Vue 的子类)

    Vue.extend = function (extendOptions) {
        extendOptions = extendOptions || {};
        var Super = this;
        var SuperId = Super.cid;
        var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
        //取缓存
        if (cachedCtors[SuperId]) {
          return cachedCtors[SuperId]
        }
    
        var name = extendOptions.name || Super.options.name;
        if (process.env.NODE_ENV !== 'production' && name) {
          validateComponentName(name);
        }
        //把一个纯对象转换一个继承于 Vue 的构造器 Sub
        var Sub = function VueComponent (options) {
          this._init(options);
        };
        //用父组件为原型创建一个构造函数
        Sub.prototype = Object.create(Super.prototype);
        Sub.prototype.constructor = Sub;
        Sub.cid = cid++;
        Sub.options = mergeOptions(
          Super.options,
          extendOptions
        );
        Sub['super'] = Super;
    
        // For props and computed properties, we define the proxy getters on
        // the Vue instances at extension time, on the extended prototype. This
        // avoids Object.defineProperty calls for each instance created.
        //对配置中的 props 和 computed 做了初始化工作;
        if (Sub.options.props) {
          initProps$1(Sub);
        }
        if (Sub.options.computed) {
          initComputed$1(Sub);
        }
    
        // allow further extension/mixin/plugin usage
        Sub.extend = Super.extend;
        Sub.mixin = Super.mixin;
        Sub.use = Super.use;
    
        // create asset registers, so extended classes
        // can have their private assets too.
        ASSET_TYPES.forEach(function (type) {
          Sub[type] = Super[type];
        });
        // enable recursive self-lookup
        if (name) {
          Sub.options.components[name] = Sub;
        }
    
        // keep a reference to the super options at extension time.
        // later at instantiation we can check if Super's options have
        // been updated.
        Sub.superOptions = Super.options;
        Sub.extendOptions = extendOptions;
        Sub.sealedOptions = extend({}, Sub.options);
    
        // cache constructor
       //取缓存
        cachedCtors[SuperId] = Sub;
        return Sub
      };
    

    相关文章

      网友评论

          本文标题:解析 Vue.extend(extendOptions)

          本文链接:https://www.haomeiwen.com/subject/bkjgahtx.html