CoffeeScript
2023-03-13
26
模板方法模式
问题
定义一个算法的结构,作为一系列的高层次的步骤,使每一个步骤的行为可以指定,使属于一个族的算法都具有相同的结构但是有不同的行为。
解决方案
使用模板方法(Template Method)在父类中描述算法的结构,再授权一个或多个具体子类来具体地进行实现。
例如,想象你希望模拟各种类型的文件的生成,并且每个文件要包含一个标题和正文。class DocumentproduceDocument: ->@produceHeader()@produceBody()produceHeader:
2023-03-13
23
归纳数组
问题
你有一个对象数组,想要把它们归纳为一个值,类似于Ruby中的reduce()和reduceRight()。
解决方案
可以使用一个匿名函数包含Array的reduce()和reduceRight()方法,保持代码清晰易懂。这里归纳可能会像对数值和字符串应用+运算符那么简单。[1,2,3,4].reduce (x,y) -> x + y
# => 10["words", "of", "bunch", "A&qu
2023-03-13
25
拆分字符串
问题
你想拆分一个字符串。
解决方案
使用JavaScript字符串的split()方法:"foo bar baz".split " "
# => [ 'foo', 'bar', 'baz' ]
讨论
String的这个split()方法是标准的JavaScript方法。可以用来基于任何分隔符——包括正则表达式来拆分字符串。这个方法还可以接受第二个参数,用于指定返回的子字符串数目。"foo-
2023-03-13
32
适配器模式
问题
想象你去国外旅行,一旦你意识到你的电源线插座与酒店房间墙上的插座不兼容时,幸运的是你记得带你的电源适配器。它将一边连接你的电源线插座另一边连接墙壁插座,允许它们之间进行通信。
同样的情况也可能会出现在代码中,当两个 ( 或更多 ) 实例 ( 类、模块等 ) 想跟对方通信,但其通信协议 ( 例如,他们所使用的语言交流 ) 不同。在这种情况下,Adapter模式更方便。它会充当翻译,从一边到另一边。
解决方案# a fragment of 3-rd party grid component
2023-03-13
27
检查变量的类型是否为数组
问题
你希望检查一个变量是否为一个数组。myArray = []
console.log typeof myArray // outputs 'object'
“typeof”运算符为数组输出了一个错误的结果。
解决方案
使用下面的代码:typeIsArray = Array.isArray || ( value ) -> return {}.toString.call( value ) is '[object Array]'
为了使用这个,
2023-03-13
25
删除数组中的相同元素
问题
你想从数组中删除相同元素。
解决方案Array::unique = ->output = {}output[@[key]] = @[key] for key in [0...@length]value for key, value of output[1,1,2,2,2,3,4,5,6,6,6,"a","a","b","d","b","c"].uniqu
2023-03-13
25
反转数组
问题
你想要反转数组元素。
解决方案
使用 JavaScript Array 的 reverse() 方法:["one", "two", "three"].reverse()
# => ["three", "two", "one"]
讨论
reverse()是标准的JavaScript方法,别忘了带圆括号。标签:CoffeeScript
2023-03-13
27
备忘录模式
问题
你想预测对一个对象做出改变后的反应。
解决方案
使用备忘录模式(Memento Pattern)来跟踪一个对象的变化。使用这个模式的类会输出一个存储在其他地方的备忘录对象。
如果你的应用程序可以让用户编辑文本文件,例如,他们可能想要撤销上一个动作。你可以在用户改变文件之前保存文件现有的状态,然后回滚到上一个位置。class PreserveableTextclass Mementoconstructor: (@text) ->constructor: (@text) ->sa