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,