Просмотр исходного кода

fix(compat): copy additional properties for functions bound via globalProperties (#4873)

close #4403
Thorsten Lünborg 4 лет назад
Родитель
Сommit
1612971471

+ 3 - 1
packages/runtime-core/src/componentPublicInstance.ts

@@ -356,7 +356,9 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
           return desc.get.call(instance.proxy)
         } else {
           const val = globalProperties[key]
-          return isFunction(val) ? val.bind(instance.proxy) : val
+          return isFunction(val)
+            ? Object.assign(val.bind(instance.proxy), val)
+            : val
         }
       } else {
         return globalProperties[key]

+ 22 - 0
packages/vue-compat/__tests__/global.spec.ts

@@ -285,6 +285,28 @@ describe('GLOBAL_PROTOTYPE', () => {
     delete Vue.prototype.$test
   })
 
+  test.only('functions keeps additional properties', () => {
+    function test(this: any) {
+      return this.msg
+    }
+    test.additionalFn = () => {
+      return 'additional fn'
+    }
+
+    Vue.prototype.$test = test
+    const vm = new Vue({
+      data() {
+        return {
+          msg: 'test'
+        }
+      }
+    }) as any
+    expect(typeof vm.$test).toBe('function')
+    expect(typeof vm.$test.additionalFn).toBe('function')
+    expect(vm.$test.additionalFn()).toBe('additional fn')
+    delete Vue.prototype.$test
+  })
+
   test('extended prototype', async () => {
     const Foo = Vue.extend()
     Foo.prototype.$test = 1