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
| /*
| * not type checking this file because flow doesn't play well with
| * dynamically accessing methods on Array prototype
| */
|
| 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
| ob.dep.notify()
| return result
| })
| })
|
|