fix(runtime-core): fix component public instance has check for accessed non-existent properties

close #4962
This commit is contained in:
Evan You 2021-11-25 18:15:06 +08:00
parent 89b2f924fc
commit aac0466cb8
2 changed files with 8 additions and 3 deletions

View File

@ -195,6 +195,11 @@ describe('component: proxy', () => {
expect('$foobar' in instanceProxy).toBe(false) expect('$foobar' in instanceProxy).toBe(false)
expect('baz' 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) // set non-existent (goes into proxyTarget sink)
instanceProxy.baz = 1 instanceProxy.baz = 1
expect('baz' in instanceProxy).toBe(true) expect('baz' in instanceProxy).toBe(true)

View File

@ -248,11 +248,11 @@ if (__COMPAT__) {
} }
const enum AccessTypes { const enum AccessTypes {
OTHER,
SETUP, SETUP,
DATA, DATA,
PROPS, PROPS,
CONTEXT, CONTEXT
OTHER
} }
export interface ComponentRenderContext { export interface ComponentRenderContext {
@ -437,7 +437,7 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
) { ) {
let normalizedProps let normalizedProps
return ( return (
accessCache![key] !== undefined || !!accessCache![key] ||
(data !== EMPTY_OBJ && hasOwn(data, key)) || (data !== EMPTY_OBJ && hasOwn(data, key)) ||
(setupState !== EMPTY_OBJ && hasOwn(setupState, key)) || (setupState !== EMPTY_OBJ && hasOwn(setupState, key)) ||
((normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key)) || ((normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key)) ||