|
1 |
| -import { isObject, toRawType, def, hasOwn, makeMap } from '@vue/shared' |
| 1 | +import { isObject, toRawType, def, hasOwn } from '@vue/shared' |
2 | 2 | import {
|
3 | 3 | mutableHandlers,
|
4 | 4 | readonlyHandlers,
|
@@ -30,17 +30,31 @@ export interface Target {
|
30 | 30 | [ReactiveFlags.READONLY]?: any
|
31 | 31 | }
|
32 | 32 |
|
33 |
| -const collectionTypes = new Set<Function>([Set, Map, WeakMap, WeakSet]) |
34 |
| -const isObservableType = /*#__PURE__*/ makeMap( |
35 |
| - 'Object,Array,Map,Set,WeakMap,WeakSet' |
36 |
| -) |
| 33 | +const enum TargetType { |
| 34 | + INVALID = 0, |
| 35 | + COMMON = 1, |
| 36 | + COLLECTION = 2 |
| 37 | +} |
37 | 38 |
|
38 |
| -const canObserve = (value: Target): boolean => { |
39 |
| - return ( |
40 |
| - !value[ReactiveFlags.SKIP] && |
41 |
| - isObservableType(toRawType(value)) && |
42 |
| - Object.isExtensible(value) |
43 |
| - ) |
| 39 | +function targetTypeMap(rawType: string) { |
| 40 | + switch (rawType) { |
| 41 | + case 'Object': |
| 42 | + case 'Array': |
| 43 | + return TargetType.COMMON |
| 44 | + case 'Map': |
| 45 | + case 'Set': |
| 46 | + case 'WeakMap': |
| 47 | + case 'WeakSet': |
| 48 | + return TargetType.COLLECTION |
| 49 | + default: |
| 50 | + return TargetType.INVALID |
| 51 | + } |
| 52 | +} |
| 53 | + |
| 54 | +function getTargetType(value: Target) { |
| 55 | + return value[ReactiveFlags.SKIP] || !Object.isExtensible(value) |
| 56 | + ? TargetType.INVALID |
| 57 | + : targetTypeMap(toRawType(value)) |
44 | 58 | }
|
45 | 59 |
|
46 | 60 | // only unwrap nested ref
|
@@ -148,12 +162,13 @@ function createReactiveObject(
|
148 | 162 | return target[reactiveFlag]
|
149 | 163 | }
|
150 | 164 | // only a whitelist of value types can be observed.
|
151 |
| - if (!canObserve(target)) { |
| 165 | + const targetType = getTargetType(target) |
| 166 | + if (targetType === TargetType.INVALID) { |
152 | 167 | return target
|
153 | 168 | }
|
154 | 169 | const observed = new Proxy(
|
155 | 170 | target,
|
156 |
| - collectionTypes.has(target.constructor) ? collectionHandlers : baseHandlers |
| 171 | + targetType === TargetType.COLLECTION ? collectionHandlers : baseHandlers |
157 | 172 | )
|
158 | 173 | def(target, reactiveFlag, observed)
|
159 | 174 | return observed
|
|
0 commit comments