diff --git a/src/core/instance/proxy.js b/src/core/instance/proxy.js index 0d6dcf80..8c821baa 100644 --- a/src/core/instance/proxy.js +++ b/src/core/instance/proxy.js @@ -45,7 +45,7 @@ if (process.env.NODE_ENV !== 'production') { const hasHandler = { has (target, key) { const has = key in target - const isAllowed = allowedGlobals(key) || key.charAt(0) === '_' + const isAllowed = allowedGlobals(key) || (typeof key === 'string' && key.charAt(0) === '_') if (!has && !isAllowed) { warnNonPresent(target, key) } diff --git a/test/unit/features/instance/render-proxy.spec.js b/test/unit/features/instance/render-proxy.spec.js index d4d01ebc..9a2365ae 100644 --- a/test/unit/features/instance/render-proxy.spec.js +++ b/test/unit/features/instance/render-proxy.spec.js @@ -28,5 +28,22 @@ if (typeof Proxy !== 'undefined') { }).$mount() expect(`Property or method "a" is not defined`).not.toHaveBeenWarned() }) + + it('support symbols using the `in` operator in hand-written render functions', () => { + const sym = Symbol() + + const vm = new Vue({ + created () { + this[sym] = 'foo' + }, + render (h) { + if (sym in this) { + return h('div', [this[sym]]) + } + } + }).$mount() + + expect(vm.$el.textContent).toBe('foo') + }) }) }