命门这个词也许并不恰当,但是每种编程语言或者每个事物都有一些最基础的东西,这些基础的东西不明白,即使你写了多年的代码,仍然会迷迷糊糊,比如前段时间我在写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()
好玩的事情就是你不仅可以改变类,还能改变类的实例.改变类的属性/方法不仅能改变之后声明的变量,之前声明的变量也会随之改变.
| 内省和反射 | |
|---|---|
|
内省:运行时获取对象所有的方法和属性 反射:运行时动态实例化和执行方法 |
重读《JavaScript设计模式》- 富有表现力的JavaScript
原文:http://www.cnblogs.com/alanland/p/4296954.html