配合没耐心的nodejs教程,写给希望快速上手的coffeescript使用者。
一、一些简写和约定:
coffeescript和python类似,空格,缩写都是有意义的。
换行替换分号,缩进替换花括号,空格替换括号,
但是数组的’[]’不能省略。
二、全局变量:
CoffeeScript剔除了全局变量,避免js中全局变量的误用。(CoffeeScript使用一个匿名函数把所有脚本都包裹起来,将其限定在局部作用域中,并且在为所有的变量赋值前自动添加var)
当然也有需要用全局变量的时候,直接给全局对象windoow赋值即可:
1 2
| exports = this exports.tempVal = “tempVal”
|
这里在顶级作用域中使用,this相当于全局变量
三、函数
3.1 函数的标准写法
-> 替代了function(){}
如
1 2 3 4
| sum = (nums...) -> result = 0 nums.forEach(n) -> result += n result
|
(nums)为传入的参数槽(splats),…表示不定参数,同时自动返回result
调用输出结果 alert sum() 或者 alert sum a,b,c ,其中空格表示括号,但是易混淆或者无参调用的时候,请带上括号。
多重赋值:
btw,因为讲到…不定参数,就提下多重赋值与…的结合:
多重赋值就是将一个数组的值逐个赋给后面的一系列变量。
如
1 2 3 4 5
| myArray = ["A", "B", "C", "D”] [start, middle..., end] = myArray console.log "start is console.log "middle is #{middle}” console.log "end is
|
输出:
1 2 3
| start is A middle is B,C end is D
|
顺便提下,数组是支持range的用法的,[1…10]
3.2函数上下文:
js的上下文变化会很频繁,尤其在回调函数内,coffeescript提供=>或者self(this)的方式,以下为=>的例子:
1 2 3
| this.clickHandler = -> alert “clicked” element.addEventListener “click”, (e) => his.clickHandler(e)
|
四、集合遍历
4.1 for循环:
1 2 3
| myLetters = [“a”,”b”,”c”,”d”] for letter in myLetters console.log letter.toUpperCase()
|
for中增加when条件
1 2
| for num,i in a when num < 5 console.log “第
|
4.2 列表推导式(Comprehension)
类似ruby的前缀表达式
1 2 3
| myLetters = [“a”,”b”,”c”,”d”] console.log letter.toUpperCase() for letter in myLetters
|
4.3 对象枚举的方式
(这里in换成了of)
1 2 3 4 5 6
| person = firstName: “Mark” lastName: “Bates” for key, value of person console.log “
|
对象属性的枚举还支持when关键字;如果需要过滤继承属性,还可以使用own关键字
1 2 3 4 5 6 7
| myObject = name: “Mark” Object.prototype.dob = new Date(1976, 7, 24) for own key, value of myObject console.log “
|
4.4 while用法
与js不同,while还可以返回结果数组
1 2 3
| num = 6 minstrel = while num -= 1 num + “ Brave Sir Robin ran away”
|
综合例子:
1 2 3
| @updateAvatars = -> name = $(‘.avatar[data-name]’),map -> $(this).data(’name’) Utils.findAvatar(name) for name in $.unique(names)
|
五、别名与存在操作符
5.1 别名:
@ 表示this的别名,如@saviour = this.saviour
:: 表示prototype
5.2 存在操作符?:
coffeescript中,?只会在变量不存在或者undefined的时候返回假,
如
还可以用来替换||操作符:
1
| velocity = southern ? 40
|
或者在访问对象时进行null检查,
1
| blacknight.getLegs()?.kick()
|
判断属性是否存在外,你还也可以把?放到kick右边,判断函数是否存在,是否可以调用等
六、类
Coffeescript中类定义是组合模式(组合使用构造模式和原型模式),继承方式则用寄生组合模式。
6.1 定义类
1 2 3 4 5 6 7 8 9 10
| class Employee constructor: (name) -> @name = name dob: (year = 1976, month =7, day = 24) -> new Date(year, month, day) emp1 = new Employee(“Mark”) console.log emp1.name console.og emp11.dob()
|
6.2 添加方法
方法是直接定义在原型上,显示为原型添加方法,很简单:
1
| Array::size = -> @length
|
6.3 构造函数简化
如果把参数赋值给同名属性,可以用@语法糖,将构造函数简化为:
6.4 实例变量的使用
1 2 3 4 5 6 7 8
| class Animal price: 5 sell: => alert “Give me animal = new Animal $(“
|
其中注意到=>的使用,表示引用方法调用的上下文,输出5.
6.5 静态变量的使用
1 2 3 4
| class Animal @find: (name) -> Animal.find(“Parrot”)
|
其实就是在类属性上(this)设置变量值。
6.6 继承
1 2 3 4 5 6 7 8
| class Animal constructor: (@name) -> class Parrot extends Animal Animal::rip = true parrot = new Parrot(“Macaw”) alert(“This parrot is no more”) if parrot.rip
|
这里要注意的是,静态变量是直接拷贝给子类的,而不是像实例属性那样使用原型来继承。
七、Mixins混入
举个例子:
module类有两个静态方法,@extend()和@include(),分别来实现对类的静态属性和实例属性的扩展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| moduleKeywords = [‘exteded’, ‘included’] class Module @extend: (obj) -> for key, value of obj when key not in moduleKeywords @[key] = value obj.extended?.apply(@) this @include: (obj) -> for key, value of obj when key not in moduleKeywords @::[key] = value obj.included?.apply(@) this
|
然后是如何使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| classProperties = find: (id) -> create: (attrs) -> instanceProperties = save: -> class User extends Module @extends classProperties @include instanceProperties user = User.find((1) user = new User user.save()
|
以上,我们为User类添加了静态属性find()和create(),还添加了实例属性save()。
再给一个例子,在扩展类后执行回调:
1 2 3 4 5 6 7 8 9
| ORM = find: (id) -> create: (attrs) -> extended: -> @include save: -> class User extends Module @extends ORM
|
基础讲完,接下来就可以围绕网络,文件,进程,异步等进行专项练习了,好运!
参考:
《The Little Book on CoffeeScript》:http://book.douban.com/subject/10462179/
Learn X in Y minutes Where X=coffeescript:http://learnxinyminutes.com/docs/coffeescript/
CoffeeScript极简教程:http://chunfenglee.com/blog/2013/10/13/beginning-coffeescript/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)