From: Evan You Date: Thu, 19 Dec 2019 19:19:47 +0000 (-0500) Subject: perf: optimize public properties access on componentProxy X-Git-Tag: v3.0.0-alpha.0~12 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d6da48a33f4e44f110d26928158125427f72abfc;p=thirdparty%2Fvuejs%2Fcore.git perf: optimize public properties access on componentProxy --- diff --git a/packages/runtime-core/src/componentProxy.ts b/packages/runtime-core/src/componentProxy.ts index cfcc27264f..dbdbe89406 100644 --- a/packages/runtime-core/src/componentProxy.ts +++ b/packages/runtime-core/src/componentProxy.ts @@ -94,29 +94,31 @@ export const PublicInstanceProxyHandlers: ProxyHandler = { // is the multiple hasOwn() calls. It's much faster to do a simple property // access on a plain object, so we use an accessCache object (with null // prototype) to memoize what access type a key corresponds to. - const n = accessCache![key] - if (n !== undefined) { - switch (n) { - case AccessTypes.DATA: - return data[key] - case AccessTypes.CONTEXT: - return renderContext[key] - case AccessTypes.PROPS: - return propsProxy![key] + if (key[0] !== '$') { + const n = accessCache![key] + if (n !== undefined) { + switch (n) { + case AccessTypes.DATA: + return data[key] + case AccessTypes.CONTEXT: + return renderContext[key] + case AccessTypes.PROPS: + return propsProxy![key] + } + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + accessCache![key] = AccessTypes.DATA + return data[key] + } else if (hasOwn(renderContext, key)) { + accessCache![key] = AccessTypes.CONTEXT + return renderContext[key] + } else if (hasOwn(props, key)) { + // only cache props access if component has declared (thus stable) props + if (type.props != null) { + accessCache![key] = AccessTypes.PROPS + } + // return the value from propsProxy for ref unwrapping and readonly + return propsProxy![key] } - } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { - accessCache![key] = AccessTypes.DATA - return data[key] - } else if (hasOwn(renderContext, key)) { - accessCache![key] = AccessTypes.CONTEXT - return renderContext[key] - } else if (hasOwn(props, key)) { - // only cache props access if component has declared (thus stable) props - if (type.props != null) { - accessCache![key] = AccessTypes.PROPS - } - // return the value from propsProxy for ref unwrapping and readonly - return propsProxy![key] } // public $xxx properties & user-attached properties (sink)