ソースを参照

fix: correct the `has` implementation in the `_renderProxy` (#7878)

It's feasible that someone might ask if something other than a string is
in the proxy such as a `Symbol` that lacks a `charAt` method.  This aligns
the implementation with the `getHandler`.
dherman 8 年 前
コミット
7b387390aa

+ 1 - 1
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)
       }

+ 17 - 0
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')
+    })
   })
 }