# 新特性proxy-管道操作符
# 管道操作符
试验性的管道操作符 |> (目前其标准化流程处于 stage 1 阶段)
let url = "!" |> decodeURI;
1
使用传统语法写的话,等效的代码是这样的:
let url = decodeURI("!");
1
# 语法
expression |> function
1
# 例子
函数链式调用节 当链式调用多个函数时,使用管道操作符可以改善代码的可读性。
const double = (n) => n * 2;
const increment = (n) => n 1;
// 没有用管道操作符
double(increment(double(5))); // 22
// 用上管道操作符之后
5 |> double |> increment |> double; // 22
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# Proxy
Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)
# 语法
let p = new Proxy(target, handler);
1
- target 用Proxy包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
- handler 一个对象,其属性是当执行一个操作时定义代理的行为的函数。
方法
Proxy.revocable()
创建一个可撤销的Proxy对象。
# 示例
# 基础示例
在以下简单的例子中,当对象中不存在属性名时,缺省返回数为37。例子中使用了 get。
let handler = {
get: function(target, name){
return name in target ? target[name] : 37;
}
};
let p = new Proxy({}, handler);
p.a = 1;
p.b = undefined;
console.log(p.a, p.b); // 1, undefined
console.log('c' in p, p.c); // false, 37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 验证
通过代理,你可以轻松地验证向一个对象的传值。这个例子使用了 set。
let validator = {
set: function(obj, prop, value) {
if (prop === 'age') {
if (!Number.isInteger(value)) {
throw new TypeError('The age is not an integer');
}
if (value > 200) {
throw new RangeError('The age seems invalid');
}
}
// The default behavior to store the value
obj[prop] = value;
}
};
let person = new Proxy({}, validator);
person.age = 100;
console.log(person.age);
// 100
person.age = 'young';
// 抛出异常: Uncaught TypeError: The age is not an integer
person.age = 300;
// 抛出异常: Uncaught RangeError: The age seems invalid
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
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