From 633c01334038d371ee03f0c18d8a193ce722bc55 Mon Sep 17 00:00:00 2001 From: Evan You Date: Sun, 3 May 2020 15:32:37 -0400 Subject: [PATCH] fix(reactivity): check own property for existing proxy of target fix #1107 --- packages/reactivity/src/reactive.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index c361673bc1e..a08a55c2c59 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -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,