]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): check own property for existing proxy of target
authorEvan You <yyx990803@gmail.com>
Sun, 3 May 2020 19:32:37 +0000 (15:32 -0400)
committerEvan You <yyx990803@gmail.com>
Sun, 3 May 2020 19:36:19 +0000 (15:36 -0400)
fix #1107

packages/reactivity/src/reactive.ts

index c361673bc1e4ecbddc0142b0d39a771318bab801..a08a55c2c59e85d4c8a3e3d177a2a0285d4ceca1 100644 (file)
@@ -1,4 +1,4 @@
-import { isObject, toRawType, def } from '@vue/shared'
+import { isObject, toRawType, def, hasOwn } from '@vue/shared'
 import {
   mutableHandlers,
   readonlyHandlers,
@@ -116,18 +116,19 @@ function createReactiveObject(
     return target
   }
   // target already has corresponding Proxy
-  let observed = isReadonly ? target.__v_readonly : target.__v_reactive
-  if (observed !== void 0) {
-    return observed
+  if (
+    hasOwn(target, isReadonly ? ReactiveFlags.readonly : ReactiveFlags.reactive)
+  ) {
+    return isReadonly ? target.__v_readonly : target.__v_reactive
   }
   // only a whitelist of value types can be observed.
   if (!canObserve(target)) {
     return target
   }
-  const handlers = collectionTypes.has(target.constructor)
-    ? collectionHandlers
-    : baseHandlers
-  observed = new Proxy(target, handlers)
+  const observed = new Proxy(
+    target,
+    collectionTypes.has(target.constructor) ? collectionHandlers : baseHandlers
+  )
   def(
     target,
     isReadonly ? ReactiveFlags.readonly : ReactiveFlags.reactive,