]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): fix toRaw for objects prototype inherting reactive
authorEvan You <yyx990803@gmail.com>
Thu, 11 Jun 2020 19:12:57 +0000 (15:12 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 11 Jun 2020 19:12:57 +0000 (15:12 -0400)
fix #1246

packages/reactivity/__tests__/reactive.spec.ts
packages/reactivity/src/baseHandlers.ts

index 46ce75b6acb449755d09e62f2158194c7f446805..800171ef3bf83f09558a3ad25aa202cc56faccc0 100644 (file)
@@ -92,13 +92,21 @@ describe('reactivity/reactive', () => {
     expect(original.bar).toBe(original2)
   })
 
-  test('unwrap', () => {
+  test('toRaw', () => {
     const original = { foo: 1 }
     const observed = reactive(original)
     expect(toRaw(observed)).toBe(original)
     expect(toRaw(original)).toBe(original)
   })
 
+  test('toRaw on object using reactive as prototype', () => {
+    const original = reactive({})
+    const obj = Object.create(original)
+    const raw = toRaw(obj)
+    expect(raw).toBe(obj)
+    expect(raw).not.toBe(toRaw(original))
+  })
+
   test('should not unwrap Ref<T>', () => {
     const observedNumberRef = reactive(ref(1))
     const observedObjectRef = reactive(ref({ foo: 1 }))
index 4a3f2d327a6fc8ab653b51770cfda5483001ac8c..f8452a35d85b2f683877ac2b6ab89838559ad276 100644 (file)
@@ -46,7 +46,13 @@ function createGetter(isReadonly = false, shallow = false) {
       return !isReadonly
     } else if (key === ReactiveFlags.isReadonly) {
       return isReadonly
-    } else if (key === ReactiveFlags.raw) {
+    } else if (
+      key === ReactiveFlags.raw &&
+      receiver ===
+        (isReadonly
+          ? (target as any).__v_readonly
+          : (target as any).__v_reactive)
+    ) {
       return target
     }