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. }