-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy path5-代理模式.js
119 lines (101 loc) · 2.1 KB
/
5-代理模式.js
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
为其他对象提供一种代理,便以控制对这个对象的访问,不能直接访问目标对象
应用场景:ES6 Proxy、Vuex中对于getters访问、图片预加载等
*/
// e.g1
// 没有代理
class Flower {}
const Jeffery = {
sendFlower: (target) => {
const flower = new Flower();
target.receiveFlower(flower);
}
}
const Athy = {
receiveFlower: (flower) => {
console.log('收到花: ', flower)
}
}
Jeffery.sendFlower(Athy)
// 引入中间人
const Other = {
receiveFlower: (flower) => {
Athy.receiveFlower(flower)
}
}
Jeffery.sendFlower(Other)
// e.g2
// 1、图片预加载
const myImage = (() => {
const img = document.createElement('img');
document.body.appendChild(img);
return (src) => {
img.src = src
}
})()
const proxyImage = (() => {
const img = new Image();
img.onload = () => {
myImage(img.src);
}
return (src) => {
myImage('file://loading.gif');
img.src = src;
}
})()
proxyImage('https://www.baidu.com/logo.png'); // 使用代理
myImage('https://www.baidu.com/logo.png'); // 没有使用代理
// e.g3
class ReadImg {
constructor (fileName) {
this.fileName = fileName
this.loadFromDisk()
}
display () {
console.log('display...' + this.fileName)
}
loadFromDisk () {
console.log('loading...' + this.fileName)
}
}
class ProxyImg {
constructor (fileName) {
this.readImg = new ReadImg(fileName)
}
display () {
this.readImg.display()
}
}
let proxyImg = new ProxyImg('1.png')
proxyImg.display()
// ES6 Proxy
let star = {
name: '张XX',
age: 15,
phone: '_star: 13987804521'
}
let agent = new Proxy(star, {
get: (target, key) => {
if (key === 'phone') {
return '_agent: 16089893333'
}
if (key === 'price') {
return 12000
}
return target[key]
},
set: (target, key, val) => {
if (key === 'customPrice') {
if (val < 100000) {
throw new Error('报价太低')
} else {
target[key] = val
return true
}
}
}
})
console.log(agent.name)
console.log(agent.age)
console.log(agent.phone)
console.log(agent.price)