1- # 装饰者模式和转发 ,call/apply
1+ # 装饰器模式和转发 ,call/apply
22
33JavaScript 在处理函数时提供了非凡的灵活性。它们可以被传递,用作对象,现在我们将看到如何在它们之间 ** 转发(forward)** 调用并 ** 装饰(decorate)** 它们。
44
@@ -43,7 +43,7 @@ alert( slow(2) ); // slow(2) 被缓存下来了
4343alert ( " Again: " + slow (2 ) ); // 和前面一行结果相同
4444```
4545
46- 在上面的代码中,` cachingDecorator ` 是一个 ** 装饰者 (decorator)** :一个特殊的函数,它接受另一个函数并改变它的行为。
46+ 在上面的代码中,` cachingDecorator ` 是一个 ** 装饰器 (decorator)** :一个特殊的函数,它接受另一个函数并改变它的行为。
4747
4848其思想是,我们可以为任何函数调用 ` cachingDecorator ` ,它将返回缓存包装器。这很棒啊,因为我们有很多函数可以使用这样的特性,而我们需要做的就是将 ` cachingDecorator ` 应用于它们。
4949
@@ -59,11 +59,11 @@ alert( "Again: " + slow(2) ); // 和前面一行结果相同
5959
6060- ` cachingDecorator ` 是可重用的。我们可以将它应用于另一个函数。
6161- 缓存逻辑是独立的,它没有增加 ` slow ` 本身的复杂性(如果有的话)。
62- - 如果需要,我们可以组合多个装饰者(其他装饰者将遵循同样的逻辑 )。
62+ - 如果需要,我们可以组合多个装饰器(其他装饰器将遵循同样的逻辑 )。
6363
6464## 使用 "func.call" 设定上下文
6565
66- 上面提到的缓存装饰者不适用于对象方法 。
66+ 上面提到的缓存装饰器不适用于对象方法 。
6767
6868例如,在下面的代码中,` worker.slow() ` 在装饰后停止工作:
6969
@@ -232,7 +232,7 @@ worker.slow = cachingDecorator(worker.slow);
232232
2332331 . 实现一个新的(或使用第三方的)类似 map 的更通用并且允许多个键的数据结构。
2342342 . 使用嵌套 map:` cache.set(min) ` 将是一个存储(键值)对 ` (max, result) ` 的 ` Map ` 。所以我们可以使用 ` cache.get(min).get(max) ` 来获取 ` result ` 。
235- 3 . 将两个值合并为一个。为了灵活性,我们可以允许为装饰者提供一个 “哈希函数”,该函数知道如何将多个值合并为一个值。
235+ 3 . 将两个值合并为一个。为了灵活性,我们可以允许为装饰器提供一个 “哈希函数”,该函数知道如何将多个值合并为一个值。
236236
237237对于许多实际应用,第三种方式就足够了,所以我们就用这个吧。
238238
@@ -392,21 +392,21 @@ hash(1, 2);
392392
393393因此,从技术上讲,它需要 ` this ` 并将 ` this[0] ` ,` this[1] ` ……等 join 在一起。它的编写方式是故意允许任何类数组的 ` this ` 的(不是巧合,很多方法都遵循这种做法)。这就是为什么它也可以和 ` this=arguments ` 一起使用。
394394
395- ## 装饰者和函数属性
395+ ## 装饰器和函数属性
396396
397- 通常,用装饰的函数替换一个函数或一个方法是安全的,除了一件小东西。如果原始函数有属性,例如 ` func.calledCount ` 或其他,则装饰后的函数将不再提供这些属性。因为这是装饰者 。因此,如果有人使用它们,那么就需要小心。
397+ 通常,用装饰的函数替换一个函数或一个方法是安全的,除了一件小东西。如果原始函数有属性,例如 ` func.calledCount ` 或其他,则装饰后的函数将不再提供这些属性。因为这是装饰器 。因此,如果有人使用它们,那么就需要小心。
398398
399399例如,在上面的示例中,如果 ` slow ` 函数具有任何属性,而 ` cachingDecorator(slow) ` 则是一个没有这些属性的包装器。
400400
401- 一些包装器可能会提供自己的属性。例如,装饰者会计算一个函数被调用了多少次以及花费了多少时间 ,并通过包装器属性公开(expose)这些信息。
401+ 一些包装器可能会提供自己的属性。例如,装饰器会计算一个函数被调用了多少次以及花费了多少时间 ,并通过包装器属性公开(expose)这些信息。
402402
403- 存在一种创建装饰者的方法,该装饰者可保留对函数属性的访问权限 ,但这需要使用特殊的 ` Proxy ` 对象来包装函数。我们将在后面的 < info:proxy#proxy-apply > 中学习它。
403+ 存在一种创建装饰器的方法,该装饰器可保留对函数属性的访问权限 ,但这需要使用特殊的 ` Proxy ` 对象来包装函数。我们将在后面的 < info:proxy#proxy-apply > 中学习它。
404404
405405## 总结
406406
407- ** 装饰者 ** 是一个围绕改变函数行为的包装器。主要工作仍由该函数来完成。
407+ ** 装饰器 ** 是一个围绕改变函数行为的包装器。主要工作仍由该函数来完成。
408408
409- 装饰者可以被看作是可以添加到函数的 "features" 或 "aspects"。我们可以添加一个或添加多个。而这一切都无需更改其代码!
409+ 装饰器可以被看作是可以添加到函数的 "features" 或 "aspects"。我们可以添加一个或添加多个。而这一切都无需更改其代码!
410410
411411为了实现 ` cachingDecorator ` ,我们研究了以下方法:
412412
@@ -423,4 +423,4 @@ let wrapper = function() {
423423
424424我们也可以看到一个 ** 方法借用(method borrowing)** 的例子,就是我们从一个对象中获取一个方法,并在另一个对象的上下文中“调用”它。采用数组方法并将它们应用于参数 ` arguments ` 是很常见的。另一种方法是使用 Rest 参数对象,该对象是一个真正的数组。
425425
426- 在 JavaScript 领域里有很多装饰者 (decorators)。通过解决本章的任务,来检查你掌握它们的程度吧。
426+ 在 JavaScript 领域里有很多装饰器 (decorators)。通过解决本章的任务,来检查你掌握它们的程度吧。
0 commit comments