1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| /*
| * not type checking this file because flow doesn't play well with
| * dynamically accessing methods on Array prototype
| */
|
| import { TriggerOpTypes } from '../../v3'
| import { def } from '../util/index'
|
| const arrayProto = Array.prototype
| export const arrayMethods = Object.create(arrayProto)
|
| const methodsToPatch = [
| 'push',
| 'pop',
| 'shift',
| 'unshift',
| 'splice',
| 'sort',
| 'reverse'
| ]
|
| /**
| * Intercept mutating methods and emit events
| */
| methodsToPatch.forEach(function (method) {
| // cache original method
| const original = arrayProto[method]
| def(arrayMethods, method, function mutator(...args) {
| const result = original.apply(this, args)
| const ob = this.__ob__
| let inserted
| switch (method) {
| case 'push':
| case 'unshift':
| inserted = args
| break
| case 'splice':
| inserted = args.slice(2)
| break
| }
| if (inserted) ob.observeArray(inserted)
| // notify change
| if (__DEV__) {
| ob.dep.notify({
| type: TriggerOpTypes.ARRAY_MUTATION,
| target: this,
| key: method
| })
| } else {
| ob.dep.notify()
| }
| return result
| })
| })
|
|