• 7.3 initMethods

    7.3 initMethods

    initMethod方法和这一节介绍的响应式没有任何的关系,他的实现也相对简单,主要是保证methods方法定义必须是函数,且命名不能和props重复,最终会将定义的方法都挂载到根实例上。

    1. function initMethods (vm, methods) {
    2. var props = vm.$options.props;
    3. for (var key in methods) {
    4. {
    5. // method必须为函数形式
    6. if (typeof methods[key] !== 'function') {
    7. warn(
    8. "Method \"" + key + "\" has type \"" + (typeof methods[key]) + "\" in the component definition. " +
    9. "Did you reference the function correctly?",
    10. vm
    11. );
    12. }
    13. // methods方法名不能和props重复
    14. if (props && hasOwn(props, key)) {
    15. warn(
    16. ("Method \"" + key + "\" has already been defined as a prop."),
    17. vm
    18. );
    19. }
    20. // 不能以_ or $.这些Vue保留标志开头
    21. if ((key in vm) && isReserved(key)) {
    22. warn(
    23. "Method \"" + key + "\" conflicts with an existing Vue instance method. " +
    24. "Avoid defining component methods that start with _ or $."
    25. );
    26. }
    27. }
    28. // 直接挂载到实例的属性上,可以通过vm[method]访问。
    29. vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);
    30. }
    31. }