Skip to content

Commit c94da3f

Browse files
authored
fix: fix vue2 array reactive bug (#4042)
* fix: fix vue2 array reactive bug * test: add observable __proto__ test case
1 parent 588e5e5 commit c94da3f

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

packages/reactive/src/__tests__/observable.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,17 @@ test('observable contains', () => {
3131
expect(contains(obj, obj.arr)).toBe(true)
3232
expect(contains(obj, arr)).toBe(true)
3333
})
34+
35+
test('observable __proto__', () => {
36+
const observableArr = observable([] as any[])
37+
// @ts-ignore
38+
observableArr.__proto__ = Object.create(Array.prototype)
39+
observableArr[0] = {}
40+
expect(observableArr).toEqual([{}])
41+
42+
const observableObj = observable({} as any)
43+
// @ts-ignore
44+
observableObj.__proto__ = Object.create(Object.prototype)
45+
observableObj.aa = {}
46+
expect(observableObj).toEqual({ aa: {} })
47+
})

packages/reactive/src/handlers.ts

+11-7
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ import { isObservable, isSupportObservable } from './externals'
77
import { createObservable } from './internals'
88

99
const wellKnownSymbols = new Set(
10-
Object.getOwnPropertyNames(Symbol)
11-
.reduce((buf: Symbol[], key) => {
12-
if (key === 'arguments' || key === 'caller') return buf
13-
const value = Symbol[key]
14-
if (typeof value === 'symbol') return buf.concat(value)
15-
return buf
16-
}, [])
10+
Object.getOwnPropertyNames(Symbol).reduce((buf: Symbol[], key) => {
11+
if (key === 'arguments' || key === 'caller') return buf
12+
const value = Symbol[key]
13+
if (typeof value === 'symbol') return buf.concat(value)
14+
return buf
15+
}, [])
1716
)
1817

1918
const hasOwnProperty = Object.prototype.hasOwnProperty
@@ -201,6 +200,11 @@ export const baseHandlers: ProxyHandler<any> = {
201200
return keys
202201
},
203202
set(target, key, value, receiver) {
203+
// vue2中有对数组原型重写,因此需去除此处proxy
204+
if (key === '__proto__') {
205+
target[key] = value
206+
return true
207+
}
204208
const hadKey = hasOwnProperty.call(target, key)
205209
const newValue = createObservable(target, key, value)
206210
const oldValue = target[key]

0 commit comments

Comments
 (0)