Skip to content

Commit 10bb34b

Browse files
committed
fix(reactivity): fix toRaw for objects prototype inherting reactive
fix #1246
1 parent f3623e4 commit 10bb34b

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

packages/reactivity/__tests__/reactive.spec.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,21 @@ describe('reactivity/reactive', () => {
9292
expect(original.bar).toBe(original2)
9393
})
9494

95-
test('unwrap', () => {
95+
test('toRaw', () => {
9696
const original = { foo: 1 }
9797
const observed = reactive(original)
9898
expect(toRaw(observed)).toBe(original)
9999
expect(toRaw(original)).toBe(original)
100100
})
101101

102+
test('toRaw on object using reactive as prototype', () => {
103+
const original = reactive({})
104+
const obj = Object.create(original)
105+
const raw = toRaw(obj)
106+
expect(raw).toBe(obj)
107+
expect(raw).not.toBe(toRaw(original))
108+
})
109+
102110
test('should not unwrap Ref<T>', () => {
103111
const observedNumberRef = reactive(ref(1))
104112
const observedObjectRef = reactive(ref({ foo: 1 }))

packages/reactivity/src/baseHandlers.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,13 @@ function createGetter(isReadonly = false, shallow = false) {
4646
return !isReadonly
4747
} else if (key === ReactiveFlags.isReadonly) {
4848
return isReadonly
49-
} else if (key === ReactiveFlags.raw) {
49+
} else if (
50+
key === ReactiveFlags.raw &&
51+
receiver ===
52+
(isReadonly
53+
? (target as any).__v_readonly
54+
: (target as any).__v_reactive)
55+
) {
5056
return target
5157
}
5258

0 commit comments

Comments
 (0)