【HZHV】config.js


config.js源码

module.exports = {
    prefix      : 'v',
    debug       : false,
    silent      : false,
    enterClass  : 'v-enter',
    leaveClass  : 'v-leave',
    attrs       : {}
}

思考

【评】这个文件会不会顾名思义,是用来配置一些属性的呢?

线索

【评】这个文件代码就比较少了,为什么会找到这里呢?以下是我的线索:

main.js

【评】一开始,我们不是找到了入口文件main.js了吗?

ViewModel.config = function (opts) {
    if (opts) {
        utils.extend(config, opts)
        if (opts.prefix) updatePrefix()
    }
    return this
}

【评】ViewModel对象config属性这里,我们可以它用到了utils对象extend方法。于是,我又去看了一下utils.js这个文件。

utils.js

var config    = require('./config'),
    attrs     = config.attrs,
    toString  = Object.prototype.toString,
    join      = Array.prototype.join,
    console   = window.console,
    ViewModel // late def

【评】看看第二行,config对象attrs属性赋值给了attrs变量,这样是不是简化了,或者是简写了呢?留个猜想。根据这个,所以就找到这个文件了。

关系

【评】这三个文件的关系可以用下面图来概括:

解释

【评】这个文件对外暴露了一个对象,这里面有好几个属性:prefixdebugsilententerClassleaveClassattrs

猜想

【评】根据这个配置对象,我有了以下猜想:

prefix

【评】这个属性的属性值是一个字符串'v',再加上这个属性中文是前缀,那么它会不会是和vue的一些指令有关呢?我们看看我们平时用的vue指令,v-bindv-onv-ifv-modelv-show等等,你仔细观察就可以看到它们都有个共同的特点,没错,就是v-,是不是和这里的prefix属性的属性值为字符串v很吻合?那么这里的字符串'v'就是这些指令的前缀。这么说来,这些指令完全可以通过技术实现,然后用户输入了指令就可以实现一些功能,也就是方法,而方法的本质又是函数。所以我做了以下猜想实验:

const prefix = 'hzh';
var suffix = ['bind','on', 'if', 'model', 'show']; 
for(var i = 0; i < suffix.length; i++) {
    console.log(prefix + '-' + suffix[i]);
}

【评】因为它们有相同的部分字符串v-,那么根据这里是用了一个属性存储了这个字符串,其实,属性本质上也是个变量。然后通过拼接字符串的方法,将v-和那些后缀拼接在一起。

新的问题

【评】既然这些指令实现的是一些功能,那么它们会不会是一些函数呢?自己尝试了一下,发现函数的标识符不能用下面这些来命名。那么尤雨溪是使用了什么方法,就可以将后缀拼接在一起,又做到实现一些功能呢?留个猜想。

attrs

其他的先不管,我们先来看看这个属性,这个简写应该是属性,它的属性值是一个空对象。

vue