函数包装是一种封装函数逻辑的技巧,用于在单个步骤内重载创建新函数或继承函数。最有价值的场景是,在重载一些已经存在的函数时,同时保持原始函数在被包装后仍然能够有效使用。
一个常见的使用场景是在编写跨浏览器代码时,必须在某个特定浏览器下实现某个特定功能。例如,Opera浏览器的实现在获取title特性值的时候有一个bug。在Prototype库中,通过函数包装技巧解决了这个bug。为了防止在readAttribute()函数中出现过多的if-else这样的代码块(比较丑陋,并且不是特别好的代码逻辑分割方式)。
让我们研究一下。首先,创建一个包装函数用于函数包装,然后用该函数为Prototype's的readAttribute()方法创建一个包装器。代码清单1 使用新功能包装旧函数
让我们深究一下wrap()函数是如何工作的。传入了一个基本对象、要包装该对象中的方法名称、新包装器函数。首先,将原有方法保存在变量fn中,稍后我们在后面会通过匿名函数的闭包来访问它。然后,我们使用一个新的匿名函数来重载该方法。新函数执行了之前传进来的包装器函数wrapper(通过闭包),并传递一个重新构造过的参数列表。
在构建这个参数列表时,我们希望第一个参数是我们要重载的原有函数,所以我们创建了一个数组,其中包含原始函数的引用,并将原始参数也追加到该数组中。正如我们在第3章所了解的,apply()方法会将该数组作为参数列表。Prototype类库利用wrap()函数,实现了对一个已经存在函数的重写(在本例中是重写了readAttribute()),取而代之的是一个新函数。
领取专属 10元无门槛券
私享最新 技术干货