重读《JavaScript设计模式》- 富有表现力的JavaScript
富有表现力的JavaScript
命门这个词也许并不恰当,但是每种编程语言或者每个事物都有一些最基础的东西,这些基础的东西不明白,即使你写了多年的代码,仍然会迷迷糊糊,比如前段时间我在写Processing程序的时候,很多初次接触程序设计的艺术家或者未来的艺术家们,常常会问"我想要这种效果,这么写怎么没用?"类似的问题,在我看来Processing或者其他的动画库一般有有两点是必须要了解的:
-
第一点就是
坐标,这个大家可能都明白点儿,一般也够用了. -
第二点就是
动画,也就是动画如何产生的.简单点说,
Processing提供了一个画布,和一个draw的接口,每秒钟会不停的调用draw很多次(frameRate),每一次draw的时候先清空(或者不清空)画布,再绘制想要图案,两次图案的视觉差就会给人产生动的感觉.
扯远了,我觉得JavaScript中这种级别的知识点就是,function和prototype:
-
函数
startAnimation = -> ... stopAnimation = -> ... -
原型
# Anim class Anim = -> ... Anim.prototype.start = -> ... Anim.prototype.stop = -> ... # usage anim = new Anim() anim.start() anim.stop()更紧凑的写法
# Anim class Anim = -> ... Anim.prototype = start = -> ... stop = -> ...为Function原型添加method方法
Function.prototype.method = (name,fn)-> @.prototype[name]=fn # Anim class Anim = -> ... Anim.method 'start', -> ... Anim.method 'storp', -> ...method的链式调用
Function.prototype.method = (name,fn)-> @.prototype[name]=fn @ # Anim class Anim = -> ... Anim .method('start', -> ...). .method('storp', -> ...)
又是类型,JavaScript虽然没有类型声明,变量值却有类型之分,和Java一样,分为原始类型和对象类型,前者值传递,后者引用传递:
-
原始类型:布尔,数值(不区分浮点整型),字符串
-
对象类型
-
函数类型
-
空类型null
-
未定义类型undefined
类型转换:
-
parseFloat
-
parseInt
-
toString
-
!!someVar
匿名函数
(-> foo=10 bar=2 alert foo*bar )()
带参数的匿名函数
((foo, bar)-> alert foo*bar )(10, 2)
匿名函数赋值
baz = ((foo, bar)-> foo*bar )(10, 2)
这里baz的值是10,
匿名函数和闭包
baz = null
(()->
foo=10
bar=2
baz = ->
foo*bar
)()
baz()
关于闭包 Closure的概念大家可以自己搜索下,Java8都有了闭包的实现.
对类和对象的修改:
Person = (name,age)->
@name=name
@age=age
Person.prototype =
getName: -> @name
getAge: -> @age
alice = new Person 'Alice', 18
bill = new Person 'Bill', 22
# modify the class
Person.prototype.getGreeting = -> "Hi, #{@name}!"
# modify a instance
alice.displayGreeting = -> alert @getGreeting()
好玩的事情就是你不仅可以改变类,还能改变类的实例.改变类的属性/方法不仅能改变之后声明的变量,之前声明的变量也会随之改变.
| 内省和反射 | |
|---|---|
|
内省:运行时获取对象所有的方法和属性 反射:运行时动态实例化和执行方法 |

浙公网安备 33010602011771号