@feng3d/reactivity 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +158 -158
  3. package/dist/index.js +89 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.umd.cjs +91 -5
  6. package/dist/index.umd.cjs.map +1 -1
  7. package/lib/ReactiveObject.d.ts +101 -0
  8. package/lib/ReactiveObject.d.ts.map +1 -0
  9. package/lib/batch.d.ts.map +1 -1
  10. package/lib/index.d.ts +5 -4
  11. package/lib/index.d.ts.map +1 -1
  12. package/package.json +69 -72
  13. package/src/ReactiveObject.ts +131 -0
  14. package/src/Reactivity.ts +168 -168
  15. package/src/arrayInstrumentations.ts +801 -801
  16. package/src/baseHandlers.ts +312 -312
  17. package/src/batch.ts +134 -118
  18. package/src/collectionHandlers.ts +486 -486
  19. package/src/computed.ts +253 -253
  20. package/src/effect.ts +146 -146
  21. package/src/effectScope.ts +294 -294
  22. package/src/index.ts +10 -9
  23. package/src/property.ts +231 -231
  24. package/src/reactive.ts +186 -186
  25. package/src/ref.ts +150 -150
  26. package/src/shared/constants.ts +41 -41
  27. package/src/shared/general.ts +109 -109
  28. package/tsconfig.json +19 -19
  29. package/dist/assets/RobotoMono-Medium-DVgDz_OO.woff2 +0 -0
  30. package/dist/assets/RobotoMono-Regular-BPoF81uy.woff2 +0 -0
  31. package/dist/assets/index-a2qCSG5V.css +0 -629
  32. package/dist/assets/index.html-Dyp3udP2.js +0 -200
  33. package/dist/assets/modulepreload-polyfill-DaKOjhqt.js +0 -37
  34. package/dist/assets/package-9zMEdmDL.js +0 -2540
  35. package/dist/assets/src//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274/index.html-a69uOZEV.js +0 -59
  36. package/dist/assets/src//346/225/260/347/273/204/index.html-CaZ_5kCZ.js +0 -43
  37. package/dist/docs/.nojekyll +0 -1
  38. package/dist/docs/assets/hierarchy.js +0 -1
  39. package/dist/docs/assets/highlight.css +0 -92
  40. package/dist/docs/assets/icons.js +0 -18
  41. package/dist/docs/assets/icons.svg +0 -1
  42. package/dist/docs/assets/main.js +0 -60
  43. package/dist/docs/assets/navigation.js +0 -1
  44. package/dist/docs/assets/search.js +0 -1
  45. package/dist/docs/assets/style.css +0 -1640
  46. package/dist/docs/classes/ComputedReactivity.html +0 -72
  47. package/dist/docs/classes/EffectReactivity.html +0 -62
  48. package/dist/docs/classes/EffectScope.html +0 -40
  49. package/dist/docs/classes/Reactivity.html +0 -35
  50. package/dist/docs/classes/RefReactivity.html +0 -57
  51. package/dist/docs/functions/batchRun.html +0 -15
  52. package/dist/docs/functions/computed.html +0 -5
  53. package/dist/docs/functions/effect.html +0 -11
  54. package/dist/docs/functions/effectScope.html +0 -5
  55. package/dist/docs/functions/forceTrack.html +0 -6
  56. package/dist/docs/functions/getCurrentScope.html +0 -4
  57. package/dist/docs/functions/isProxy.html +0 -5
  58. package/dist/docs/functions/isReactive.html +0 -5
  59. package/dist/docs/functions/isRef.html +0 -5
  60. package/dist/docs/functions/noTrack.html +0 -6
  61. package/dist/docs/functions/onScopeDispose.html +0 -6
  62. package/dist/docs/functions/reactive.html +0 -19
  63. package/dist/docs/functions/ref.html +0 -13
  64. package/dist/docs/functions/toRaw.html +0 -4
  65. package/dist/docs/hierarchy.html +0 -1
  66. package/dist/docs/index.html +0 -129
  67. package/dist/docs/interfaces/Computed.html +0 -9
  68. package/dist/docs/interfaces/Effect.html +0 -8
  69. package/dist/docs/interfaces/Ref.html +0 -9
  70. package/dist/docs/modules.html +0 -1
  71. package/dist/docs/types/Reactive.html +0 -3
  72. package/dist/docs/types/UnReadonly.html +0 -3
  73. package/dist/files/RobotoMono-Medium.woff2 +0 -0
  74. package/dist/files/RobotoMono-Regular.woff2 +0 -0
  75. package/dist/files/ic_code_black_24dp.svg +0 -4
  76. package/dist/files/ic_search_black_24dp.svg +0 -4
  77. package/dist/files/main.css +0 -629
  78. package/dist/files/thumbnails.svg +0 -7
  79. package/dist/files.json +0 -7
  80. package/dist/index.html +0 -84
  81. package/dist/screenshots//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274.jpg +0 -0
  82. package/dist/screenshots//346/225/260/347/273/204.jpg +0 -0
  83. package/dist/src//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274/index.html +0 -70
  84. package/dist/src//346/225/260/347/273/204/index.html +0 -65
  85. package/dist/tags.json +0 -2
@@ -1,312 +1,312 @@
1
- import { arrayInstrumentations } from './arrayInstrumentations';
2
- import { reactive, reactiveMap } from './reactive';
3
- import { isRef } from './ref';
4
- import { ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';
5
- import { hasChanged, hasOwn, isArray, isIntegerKey, isObject, isSymbol, makeMap, Target, toRaw } from './shared/general';
6
- import { PropertyReactivity } from './property';
7
-
8
- /**
9
- * 基础响应式处理器。
10
- *
11
- * 实现了 Proxy 的 get 拦截器,用于:
12
- * 1. 响应式对象的标识和原始对象获取
13
- * 2. 数组方法的特殊处理
14
- * 3. 属性的依赖追踪
15
- * 4. 值的自动解包和响应式转换
16
- */
17
- class BaseReactiveHandler implements ProxyHandler<Target>
18
- {
19
- /**
20
- * 获取对象的属性值。
21
- *
22
- * 实现了以下功能:
23
- * 1. 响应式对象标识检查
24
- * 2. 原始对象获取
25
- * 3. 数组方法拦截
26
- * 4. 属性依赖追踪
27
- * 5. 值的自动解包
28
- * 6. 对象的自动响应式转换
29
- *
30
- * @param target 被代理的原始对象
31
- * @param key 要获取的属性名
32
- * @param receiver 代理对象本身
33
- * @returns 获取到的属性值
34
- */
35
- get(target: Target, key: string | symbol, receiver: object): any
36
- {
37
- // 检查是否为响应式对象
38
- if (key === ReactiveFlags.IS_REACTIVE)
39
- {
40
- return true;
41
- }
42
- // 获取原始对象
43
- else if (key === ReactiveFlags.RAW)
44
- {
45
- if (
46
- receiver === reactiveMap.get(target)
47
- // receiver 不是响应式代理,但具有相同的原型
48
- // 这意味着 receiver 是响应式代理的用户代理
49
- || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)
50
- )
51
- {
52
- return target;
53
- }
54
-
55
- // 提前返回 undefined
56
- return;
57
- }
58
-
59
- const targetIsArray = isArray(target);
60
-
61
- // 处理数组方法
62
- let fn: Function | undefined;
63
-
64
- if (targetIsArray && (fn = arrayInstrumentations[key]))
65
- {
66
- return fn;
67
- }
68
- // 处理 hasOwnProperty 方法
69
- if (key === 'hasOwnProperty')
70
- {
71
- return hasOwnProperty;
72
- }
73
-
74
- // 获取属性值
75
- const res = Reflect.get(
76
- target,
77
- key,
78
- isRef(target) ? target : receiver,
79
- );
80
-
81
- // 跳过内置 Symbol 和非追踪键的依赖追踪
82
- if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key))
83
- {
84
- return res;
85
- }
86
-
87
- // 追踪属性访问
88
- PropertyReactivity.track(target, TrackOpTypes.GET, key as any);
89
-
90
- // 自动解包 ref 值
91
- if (isRef(res))
92
- {
93
- return targetIsArray && isIntegerKey(key) ? res : res.value;
94
- }
95
-
96
- // 自动转换对象为响应式
97
- if (isObject(res))
98
- {
99
- return reactive(res);
100
- }
101
-
102
- return res;
103
- }
104
- }
105
-
106
- /**
107
- * 可变响应式处理器。
108
- *
109
- * 继承自基础响应式处理器,增加了:
110
- * 1. 属性设置拦截
111
- * 2. 属性删除拦截
112
- * 3. 属性存在性检查拦截
113
- * 4. 属性遍历拦截
114
- */
115
- class MutableReactiveHandler extends BaseReactiveHandler
116
- {
117
- /**
118
- * 设置对象的属性值。
119
- *
120
- * 实现了以下功能:
121
- * 1. 值的原始化处理
122
- * 2. ref 值的特殊处理
123
- * 3. 属性变更通知
124
- * 4. 数组长度的特殊处理
125
- *
126
- * @param target 被代理的原始对象
127
- * @param key 要设置的属性名
128
- * @param value 要设置的新值
129
- * @param receiver 代理对象本身
130
- * @returns 设置是否成功
131
- */
132
- set(
133
- target: Record<string | symbol, unknown>,
134
- key: string | symbol,
135
- value: unknown,
136
- receiver: object,
137
- ): boolean
138
- {
139
- let oldValue = target[key];
140
-
141
- // 获取原始值进行比较
142
- oldValue = toRaw(oldValue);
143
- value = toRaw(value);
144
-
145
- // 处理 ref 值的特殊情况
146
- if (!isArray(target) && isRef(oldValue) && !isRef(value))
147
- {
148
- oldValue.value = value;
149
-
150
- return true;
151
- }
152
-
153
- // 检查属性是否存在
154
- const hadKey
155
- = isArray(target) && isIntegerKey(key)
156
- ? Number(key) < target.length
157
- : hasOwn(target, key);
158
- const result = Reflect.set(
159
- target,
160
- key,
161
- value,
162
- isRef(target) ? target : receiver,
163
- );
164
-
165
- // 确保目标在原始原型链中
166
- __DEV__ && console.assert(target === toRaw(receiver));
167
-
168
- // 触发属性变更通知
169
- if (target === toRaw(receiver))
170
- {
171
- if (!hadKey)
172
- {
173
- // 新增属性
174
- PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);
175
- }
176
- else if (hasChanged(value, oldValue))
177
- {
178
- // 修改属性
179
- PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);
180
- }
181
- }
182
-
183
- return result;
184
- }
185
-
186
- /**
187
- * 删除对象的属性。
188
- *
189
- * 实现了以下功能:
190
- * 1. 属性删除操作
191
- * 2. 删除后的变更通知
192
- *
193
- * @param target 被代理的原始对象
194
- * @param key 要删除的属性名
195
- * @returns 删除是否成功
196
- */
197
- deleteProperty(
198
- target: Record<string | symbol, unknown>,
199
- key: string | symbol,
200
- ): boolean
201
- {
202
- const hadKey = hasOwn(target, key);
203
- const oldValue = target[key];
204
- const result = Reflect.deleteProperty(target, key);
205
-
206
- if (result && hadKey)
207
- {
208
- // 触发删除通知
209
- PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);
210
- }
211
-
212
- return result;
213
- }
214
-
215
- /**
216
- * 检查对象是否包含某个属性。
217
- *
218
- * 实现了以下功能:
219
- * 1. 属性存在性检查
220
- * 2. 属性访问依赖追踪
221
- *
222
- * @param target 被代理的原始对象
223
- * @param key 要检查的属性名
224
- * @returns 属性是否存在
225
- */
226
- has(target: Record<string | symbol, unknown>, key: string | symbol): boolean
227
- {
228
- const result = Reflect.has(target, key);
229
-
230
- if (!isSymbol(key) || !builtInSymbols.has(key))
231
- {
232
- // 追踪属性访问
233
- PropertyReactivity.track(target, TrackOpTypes.HAS, key);
234
- }
235
-
236
- return result;
237
- }
238
-
239
- /**
240
- * 获取对象的所有属性名。
241
- *
242
- * 实现了以下功能:
243
- * 1. 属性遍历
244
- * 2. 遍历操作的依赖追踪
245
- *
246
- * @param target 被代理的原始对象
247
- * @returns 对象的所有属性名数组
248
- */
249
- ownKeys(target: Record<string | symbol, unknown>): (string | symbol)[]
250
- {
251
- // 追踪遍历操作
252
- PropertyReactivity.track(
253
- target,
254
- TrackOpTypes.ITERATE,
255
- isArray(target) ? 'length' : ITERATE_KEY,
256
- );
257
-
258
- return Reflect.ownKeys(target);
259
- }
260
- }
261
-
262
- /**
263
- * 可变响应式处理器实例。
264
- *
265
- * 用于创建可变的响应式对象。
266
- */
267
- export const mutableHandlers: ProxyHandler<object> = new MutableReactiveHandler();
268
-
269
- /**
270
- * 自定义 hasOwnProperty 方法。
271
- *
272
- * 实现了以下功能:
273
- * 1. 属性存在性检查
274
- * 2. 属性访问依赖追踪
275
- *
276
- * @param this 调用对象
277
- * @param key 要检查的属性名
278
- * @returns 属性是否存在
279
- */
280
- function hasOwnProperty(this: object, key: unknown)
281
- {
282
- // #10455 hasOwnProperty 可能被非字符串值调用
283
- if (!isSymbol(key)) key = String(key);
284
- const obj = toRaw(this);
285
-
286
- // 追踪属性访问
287
- PropertyReactivity.track(obj, TrackOpTypes.HAS, key);
288
-
289
- return obj.hasOwnProperty(key as string);
290
- }
291
-
292
- /**
293
- * 内置 Symbol 集合。
294
- *
295
- * 用于过滤不需要追踪的 Symbol 属性。
296
- */
297
- const builtInSymbols = new Set(
298
- /* @__PURE__ */
299
- Object.getOwnPropertyNames(Symbol)
300
- // ios10.x Object.getOwnPropertyNames(Symbol) 可以枚举 'arguments' 和 'caller'
301
- // 但在 Symbol 上访问它们会导致 TypeError,因为 Symbol 是严格模式函数
302
- .filter((key) => key !== 'arguments' && key !== 'caller')
303
- .map((key) => Symbol[key as keyof SymbolConstructor])
304
- .filter(isSymbol),
305
- );
306
-
307
- /**
308
- * 非追踪键集合。
309
- *
310
- * 用于过滤不需要追踪的属性名。
311
- */
312
- const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);
1
+ import { arrayInstrumentations } from './arrayInstrumentations';
2
+ import { reactive, reactiveMap } from './reactive';
3
+ import { isRef } from './ref';
4
+ import { ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';
5
+ import { hasChanged, hasOwn, isArray, isIntegerKey, isObject, isSymbol, makeMap, Target, toRaw } from './shared/general';
6
+ import { PropertyReactivity } from './property';
7
+
8
+ /**
9
+ * 基础响应式处理器。
10
+ *
11
+ * 实现了 Proxy 的 get 拦截器,用于:
12
+ * 1. 响应式对象的标识和原始对象获取
13
+ * 2. 数组方法的特殊处理
14
+ * 3. 属性的依赖追踪
15
+ * 4. 值的自动解包和响应式转换
16
+ */
17
+ class BaseReactiveHandler implements ProxyHandler<Target>
18
+ {
19
+ /**
20
+ * 获取对象的属性值。
21
+ *
22
+ * 实现了以下功能:
23
+ * 1. 响应式对象标识检查
24
+ * 2. 原始对象获取
25
+ * 3. 数组方法拦截
26
+ * 4. 属性依赖追踪
27
+ * 5. 值的自动解包
28
+ * 6. 对象的自动响应式转换
29
+ *
30
+ * @param target 被代理的原始对象
31
+ * @param key 要获取的属性名
32
+ * @param receiver 代理对象本身
33
+ * @returns 获取到的属性值
34
+ */
35
+ get(target: Target, key: string | symbol, receiver: object): any
36
+ {
37
+ // 检查是否为响应式对象
38
+ if (key === ReactiveFlags.IS_REACTIVE)
39
+ {
40
+ return true;
41
+ }
42
+ // 获取原始对象
43
+ else if (key === ReactiveFlags.RAW)
44
+ {
45
+ if (
46
+ receiver === reactiveMap.get(target)
47
+ // receiver 不是响应式代理,但具有相同的原型
48
+ // 这意味着 receiver 是响应式代理的用户代理
49
+ || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)
50
+ )
51
+ {
52
+ return target;
53
+ }
54
+
55
+ // 提前返回 undefined
56
+ return;
57
+ }
58
+
59
+ const targetIsArray = isArray(target);
60
+
61
+ // 处理数组方法
62
+ let fn: Function | undefined;
63
+
64
+ if (targetIsArray && (fn = arrayInstrumentations[key]))
65
+ {
66
+ return fn;
67
+ }
68
+ // 处理 hasOwnProperty 方法
69
+ if (key === 'hasOwnProperty')
70
+ {
71
+ return hasOwnProperty;
72
+ }
73
+
74
+ // 获取属性值
75
+ const res = Reflect.get(
76
+ target,
77
+ key,
78
+ isRef(target) ? target : receiver,
79
+ );
80
+
81
+ // 跳过内置 Symbol 和非追踪键的依赖追踪
82
+ if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key))
83
+ {
84
+ return res;
85
+ }
86
+
87
+ // 追踪属性访问
88
+ PropertyReactivity.track(target, TrackOpTypes.GET, key as any);
89
+
90
+ // 自动解包 ref 值
91
+ if (isRef(res))
92
+ {
93
+ return targetIsArray && isIntegerKey(key) ? res : res.value;
94
+ }
95
+
96
+ // 自动转换对象为响应式
97
+ if (isObject(res))
98
+ {
99
+ return reactive(res);
100
+ }
101
+
102
+ return res;
103
+ }
104
+ }
105
+
106
+ /**
107
+ * 可变响应式处理器。
108
+ *
109
+ * 继承自基础响应式处理器,增加了:
110
+ * 1. 属性设置拦截
111
+ * 2. 属性删除拦截
112
+ * 3. 属性存在性检查拦截
113
+ * 4. 属性遍历拦截
114
+ */
115
+ class MutableReactiveHandler extends BaseReactiveHandler
116
+ {
117
+ /**
118
+ * 设置对象的属性值。
119
+ *
120
+ * 实现了以下功能:
121
+ * 1. 值的原始化处理
122
+ * 2. ref 值的特殊处理
123
+ * 3. 属性变更通知
124
+ * 4. 数组长度的特殊处理
125
+ *
126
+ * @param target 被代理的原始对象
127
+ * @param key 要设置的属性名
128
+ * @param value 要设置的新值
129
+ * @param receiver 代理对象本身
130
+ * @returns 设置是否成功
131
+ */
132
+ set(
133
+ target: Record<string | symbol, unknown>,
134
+ key: string | symbol,
135
+ value: unknown,
136
+ receiver: object,
137
+ ): boolean
138
+ {
139
+ let oldValue = target[key];
140
+
141
+ // 获取原始值进行比较
142
+ oldValue = toRaw(oldValue);
143
+ value = toRaw(value);
144
+
145
+ // 处理 ref 值的特殊情况
146
+ if (!isArray(target) && isRef(oldValue) && !isRef(value))
147
+ {
148
+ oldValue.value = value;
149
+
150
+ return true;
151
+ }
152
+
153
+ // 检查属性是否存在
154
+ const hadKey
155
+ = isArray(target) && isIntegerKey(key)
156
+ ? Number(key) < target.length
157
+ : hasOwn(target, key);
158
+ const result = Reflect.set(
159
+ target,
160
+ key,
161
+ value,
162
+ isRef(target) ? target : receiver,
163
+ );
164
+
165
+ // 确保目标在原始原型链中
166
+ __DEV__ && console.assert(target === toRaw(receiver));
167
+
168
+ // 触发属性变更通知
169
+ if (target === toRaw(receiver))
170
+ {
171
+ if (!hadKey)
172
+ {
173
+ // 新增属性
174
+ PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);
175
+ }
176
+ else if (hasChanged(value, oldValue))
177
+ {
178
+ // 修改属性
179
+ PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);
180
+ }
181
+ }
182
+
183
+ return result;
184
+ }
185
+
186
+ /**
187
+ * 删除对象的属性。
188
+ *
189
+ * 实现了以下功能:
190
+ * 1. 属性删除操作
191
+ * 2. 删除后的变更通知
192
+ *
193
+ * @param target 被代理的原始对象
194
+ * @param key 要删除的属性名
195
+ * @returns 删除是否成功
196
+ */
197
+ deleteProperty(
198
+ target: Record<string | symbol, unknown>,
199
+ key: string | symbol,
200
+ ): boolean
201
+ {
202
+ const hadKey = hasOwn(target, key);
203
+ const oldValue = target[key];
204
+ const result = Reflect.deleteProperty(target, key);
205
+
206
+ if (result && hadKey)
207
+ {
208
+ // 触发删除通知
209
+ PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);
210
+ }
211
+
212
+ return result;
213
+ }
214
+
215
+ /**
216
+ * 检查对象是否包含某个属性。
217
+ *
218
+ * 实现了以下功能:
219
+ * 1. 属性存在性检查
220
+ * 2. 属性访问依赖追踪
221
+ *
222
+ * @param target 被代理的原始对象
223
+ * @param key 要检查的属性名
224
+ * @returns 属性是否存在
225
+ */
226
+ has(target: Record<string | symbol, unknown>, key: string | symbol): boolean
227
+ {
228
+ const result = Reflect.has(target, key);
229
+
230
+ if (!isSymbol(key) || !builtInSymbols.has(key))
231
+ {
232
+ // 追踪属性访问
233
+ PropertyReactivity.track(target, TrackOpTypes.HAS, key);
234
+ }
235
+
236
+ return result;
237
+ }
238
+
239
+ /**
240
+ * 获取对象的所有属性名。
241
+ *
242
+ * 实现了以下功能:
243
+ * 1. 属性遍历
244
+ * 2. 遍历操作的依赖追踪
245
+ *
246
+ * @param target 被代理的原始对象
247
+ * @returns 对象的所有属性名数组
248
+ */
249
+ ownKeys(target: Record<string | symbol, unknown>): (string | symbol)[]
250
+ {
251
+ // 追踪遍历操作
252
+ PropertyReactivity.track(
253
+ target,
254
+ TrackOpTypes.ITERATE,
255
+ isArray(target) ? 'length' : ITERATE_KEY,
256
+ );
257
+
258
+ return Reflect.ownKeys(target);
259
+ }
260
+ }
261
+
262
+ /**
263
+ * 可变响应式处理器实例。
264
+ *
265
+ * 用于创建可变的响应式对象。
266
+ */
267
+ export const mutableHandlers: ProxyHandler<object> = new MutableReactiveHandler();
268
+
269
+ /**
270
+ * 自定义 hasOwnProperty 方法。
271
+ *
272
+ * 实现了以下功能:
273
+ * 1. 属性存在性检查
274
+ * 2. 属性访问依赖追踪
275
+ *
276
+ * @param this 调用对象
277
+ * @param key 要检查的属性名
278
+ * @returns 属性是否存在
279
+ */
280
+ function hasOwnProperty(this: object, key: unknown)
281
+ {
282
+ // #10455 hasOwnProperty 可能被非字符串值调用
283
+ if (!isSymbol(key)) key = String(key);
284
+ const obj = toRaw(this);
285
+
286
+ // 追踪属性访问
287
+ PropertyReactivity.track(obj, TrackOpTypes.HAS, key);
288
+
289
+ return obj.hasOwnProperty(key as string);
290
+ }
291
+
292
+ /**
293
+ * 内置 Symbol 集合。
294
+ *
295
+ * 用于过滤不需要追踪的 Symbol 属性。
296
+ */
297
+ const builtInSymbols = new Set(
298
+ /* @__PURE__ */
299
+ Object.getOwnPropertyNames(Symbol)
300
+ // ios10.x Object.getOwnPropertyNames(Symbol) 可以枚举 'arguments' 和 'caller'
301
+ // 但在 Symbol 上访问它们会导致 TypeError,因为 Symbol 是严格模式函数
302
+ .filter((key) => key !== 'arguments' && key !== 'caller')
303
+ .map((key) => Symbol[key as keyof SymbolConstructor])
304
+ .filter(isSymbol),
305
+ );
306
+
307
+ /**
308
+ * 非追踪键集合。
309
+ *
310
+ * 用于过滤不需要追踪的属性名。
311
+ */
312
+ const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);