账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    在Vue源码中,为什么在Vue上挂载了两个相同的方法却都能执行?
    29
    0

    entry-runtime-with-compiler.js内

    const mount = Vue.prototype.$mount
    Vue.prototype.$mount = function (
      el?: string | Element,
      hydrating?: boolean
    ): Component {
      el = el && query(el)
      /* istanbul ignore if */
      if (el === document.body || el === document.documentElement) {
        process.env.NODE_ENV !== 'production' && warn(
          `Do not mount Vue to <html> or <body> - mount to normal elements instead.`
        )
        return this
      }
    //太长了贴一部分

    /runtime/index.js

    Vue.prototype.$mount = function (
      el?: string | Element,
      hydrating?: boolean
    ): Component {
      el = el && inBrowser ? query(el) : undefined
      return mountComponent(this, el, hydrating)
    }

    然后我自己新建几个js试了下为什么不行呢
    test.js

    function va(){}
    export {va}

    test1.js

    import {va} from './test.js'
    va.prototype.hei = function(){
        alert(1)
        console.log(1)
    }

    test2.js

    import {va} from './test.js'
    const ob = va.prototype.hei
    va.prototype.hei = function(){
        alert(2)
        console.log(2)
    }

    test3.js

    import {va} from './test.js'
    var a = new va();
    a.hei()

    最后只alert2,打印了2
    ps:我为了保持相似所以建了好几个..但是为什么不行呢

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 三世今生 普通会员 1楼

      在Vue中,你可以在methodsdata属性中定义两个同名的方法,这两个方法会在同一组件实例的任何时刻被执行。这是因为Vue会在组件实例初始化时,会检查是否有名为methodsdata的属性。如果有,它就会执行对应的methodsdata方法。如果有多个方法被定义,那么 Vue 会执行其中的第一个。

      然而,如果你在methodsdata属性中定义了两个不同的方法,那么它们会在不同的组件实例中被执行。这是因为Vue会在组件实例初始化时,会检查是否有名为methodsdata的属性。如果有,它就会执行对应的methodsdata方法。如果在这个过程中没有找到methodsdata的属性,那么它就会执行一个默认的方法。

      例如,假设你有以下两个方法:

      javascript export default { methods: { sayHello() { console.log('Hello, world!'); } }, data() { return { name: 'World' }; } };

      在上面的代码中,当你在Vue实例中使用sayHello方法时,它会在对应的组件实例中被执行,而不是在所有组件实例中都被执行。这是因为Vue会检查是否有名为sayHello的方法。如果有,那么它就会执行这个方法。如果没有,那么它就会执行一个默认的方法。

      如果你想要在所有组件实例中都执行这个方法,你可以使用this.$emit('sayHello')来发送一个事件给所有的组件实例,或者使用this.$emit('hello', 'world')来发送一个事件给当前的组件实例。

      请注意,如果你在methodsdata属性中定义了一个函数,那么这个函数会作为方法被执行。如果你在methodsdata属性中定义了一个数组,那么这个数组会作为方法被执行。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部