本文整理自网络,侵删。
检测与构建丢失的函数
问题
你想要检测一个函数是否存在,如果不存在则构建该函数。(比如Internet Explorer 8的ECMAScript 5函数)。
解决方案
使用存在赋值运算符(?=)来把函数分配给类库的原型(使用::简写),然后把它放于一个立即执行函数表达式中(do ->)使其含有所有变量。
do -> Array::filter ?= (callback) ->
element for element in this when callback element
array = [1..10]
array.filter (x) -> x > 5
# => [6,7,8,9,10]
讨论
在JavaScript (同样地,在 CoffeeScript)中,对象都有一个原型成员,它定义了什么成员函数能够适用于基于该原型的所有对象。
在CoffeeScript中,你可以使用 :: 捷径来访问这个原型。所以如果你想要把过滤函数添加至数组类中,就执行Array::filter=...语句。它能把过滤函数加至所有数组中。
但是,不要去覆盖一个在第一时间还没有构造的原型。比如,如果Array::filter = ...已经以快速本地形式存在于浏览器中,或者库制造者拥有其对于Array::filter = ...的独特版本,这样以来,你要么换一个慢速的JavaScript版本,要么打破这种依赖于其自身Array::shuffle的库。
你需要做的仅仅是在函数不存在的时候添加该函数。这就是存在赋值运算符(?=)的意义。如果我们执行Array::filter = ...语句,它会首先判断Array::filter是否已经存在。如果存在的话,它就会使用现在的版本。否则,它会添加你的版本。
相关阅读 >>
更多相关阅读请进入《CoffeeScript》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者