码迷,mamicode.com
首页 > 编程语言 > 详细

重读《JavaScript设计模式》- 富有表现力的JavaScript

时间:2015-02-21 14:16:30      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

富有表现力的JavaScript

语言的命门

命门这个词也许并不恰当,但是每种编程语言或者每个事物都有一些最基础的东西,这些基础的东西不明白,即使你写了多年的代码,仍然会迷迷糊糊,比如前段时间我在写Processing程序的时候,很多初次接触程序设计的艺术家或者未来的艺术家们,常常会问"我想要这种效果,这么写怎么没用?"类似的问题,在我看来Processing或者其他的动画库一般有有两点是必须要了解的:

  • 第一点就是坐标,这个大家可能都明白点儿,一般也够用了.

  • 第二点就是动画,也就是动画如何产生的

    简单点说,Processing提供了一个画布,和一个draw的接口,每秒钟会不停的调用draw很多次(frameRate),每一次draw的时候先清空(或者不清空)画布,再绘制想要图案,两次图案的视觉差就会给人产生动的感觉.

扯远了,我觉得JavaScript中这种级别的知识点就是,functionprototype

  • 函数

    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设计模式》- 富有表现力的JavaScript

标签:

原文地址:http://www.cnblogs.com/alanland/p/4296954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!