fix(reactivity): fix toRaw for objects prototype inherting reactive

fix #1246
This commit is contained in:
Evan You 2020-06-11 15:12:57 -04:00
parent f3623e4d1e
commit 10bb34bb86
2 changed files with 16 additions and 2 deletions

View File

@ -92,13 +92,21 @@ describe('reactivity/reactive', () => {
expect(original.bar).toBe(original2) expect(original.bar).toBe(original2)
}) })
test('unwrap', () => { test('toRaw', () => {
const original = { foo: 1 } const original = { foo: 1 }
const observed = reactive(original) const observed = reactive(original)
expect(toRaw(observed)).toBe(original) expect(toRaw(observed)).toBe(original)
expect(toRaw(original)).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>', () => { test('should not unwrap Ref<T>', () => {
const observedNumberRef = reactive(ref(1)) const observedNumberRef = reactive(ref(1))
const observedObjectRef = reactive(ref({ foo: 1 })) const observedObjectRef = reactive(ref({ foo: 1 }))

View File

@ -46,7 +46,13 @@ function createGetter(isReadonly = false, shallow = false) {
return !isReadonly return !isReadonly
} else if (key === ReactiveFlags.isReadonly) { } else if (key === ReactiveFlags.isReadonly) {
return 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 return target
} }