diff --git a/packages/runtime-core/__tests__/componentPublicInstance.spec.ts b/packages/runtime-core/__tests__/componentPublicInstance.spec.ts index c4c456b5f7a..0274351f863 100644 --- a/packages/runtime-core/__tests__/componentPublicInstance.spec.ts +++ b/packages/runtime-core/__tests__/componentPublicInstance.spec.ts @@ -195,6 +195,11 @@ describe('component: proxy', () => { expect('$foobar' in instanceProxy).toBe(false) expect('baz' in instanceProxy).toBe(false) + // #4962 triggering getter should not cause non-existent property to + // pass the has check + instanceProxy.baz + expect('baz' in instanceProxy).toBe(false) + // set non-existent (goes into proxyTarget sink) instanceProxy.baz = 1 expect('baz' in instanceProxy).toBe(true) diff --git a/packages/runtime-core/src/componentPublicInstance.ts b/packages/runtime-core/src/componentPublicInstance.ts index dd385a815c9..8298aff42b1 100644 --- a/packages/runtime-core/src/componentPublicInstance.ts +++ b/packages/runtime-core/src/componentPublicInstance.ts @@ -248,11 +248,11 @@ if (__COMPAT__) { } const enum AccessTypes { + OTHER, SETUP, DATA, PROPS, - CONTEXT, - OTHER + CONTEXT } export interface ComponentRenderContext { @@ -437,7 +437,7 @@ export const PublicInstanceProxyHandlers: ProxyHandler = { ) { let normalizedProps return ( - accessCache![key] !== undefined || + !!accessCache![key] || (data !== EMPTY_OBJ && hasOwn(data, key)) || (setupState !== EMPTY_OBJ && hasOwn(setupState, key)) || ((normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key)) ||