读javascript设计模式笔记(一)富有表现力的javascript

一、javascript的灵活性

javascript最强大的特性就是其灵活性。作为javascript程序员,只要你愿意,可以把程序写得很简单,也可以写得很复杂。既可以采用函数式编程风格,也可以采用更复杂一点的面向对象编程风格。先来看一个用不同方法完成同样任务的例子:启动和停止一个动画。

 1 /*过程式的程序设计*/
 2 function startAnimation(){
 3      ....
 4 }
 5 function stopAnimation(){
 6      ....
 7 }
 8 
 9 /*定义一个类*/
10 var Anim = function(){
11     .....
12 };
13 Anim.prototype.start = function(){
14    .....
15 };
16 Anim.prototype.stop = function(){
17    .....
18 };
19 
20 var myAnim = new Anim();
21 myAnim.start();
22 ......
23 myAnim.stop();
24 
25 /*还可以这样*/
26 var Anim = function(){
27     .....
28 };
29 Anim.prototype = {
30     start : function(){
31             ....
32      },
33      stop : function(){
34             .....
35      }
36 };
37 
38 /*还可以更加精简*/
39 
40 Function.portotype.method = function(name,fn){
41        this.prototype[name] = fn;
42 };
43 var Anim = function(){
44      ....
45 };
46 Anim.method('start',function(){
47       .....
48 });
49 Anim.method('stop',function(){
50       .....
51 });
52 /*还可以进一步修改使其支持链式调用*/
53 Function.portotype.method = function(name,fn){
54        this.prototype[name] = fn;
55        return this;
56 };
57 /*可以这样调用*/
58 Anim.method('start',functiom(){
59      ......
60 }).method('stop',function(){
61      ......
62 });

二、弱类型语音
在javascript中,定义变量时不必声明其类型。但是并不意味着变量没有类型。一个变量可以属于几种类型之一,这取决于其包含的数据。javascript中有3种原始类型:布尔型、数值型和字符串类型。此外,还有对象类型和包含可执行的代码类型。最后,还有空类型(null)和未定义类型(undefined)这两种数据类型。原始数据类型按值传递,而其他数据类型则按引用传递。与其他弱类型语言一样,javascript中的变量可以根据所赋的值改变类型。原始类型之间也可以进行类型转换。toString方法可以把数值或布尔值转变为字符串。parseFloat和parseInt函数可以把字符串转变为数值。双重“非”操作可以把字符串或数值转变为布尔值:
var num = 0;
alert(!!num); // false
num = "false";
alert(!!num);  //  true

num = ""; 
alert(!!num);//  false

三、函数是一等对象

在javascript中,函数是一等对象。它们可以存储在变量中,可以作为参数传递给其他函数,可以作为返回值从其他函数传出,还可以在运行时进行构造。在与函数打交道时,这些特性带来了极大地灵活性和极强的表达能力。

可以用function() {.....}这样的语句创建匿名函数。它们没有函数名,但可以被赋给变量。

如:

1 var baz = (function(foo, bar){
2       return foo * bar;
3 })(10, 2);
4 
5 alert(baz);  //20

匿名函数最有趣的用途是用来创建闭包,闭包(closure)是一种受到保护的变量空间,由内嵌函数生成。javascript具有函数级的作用域,这意味着定义函数内部的变量在函数外部不能被访问。javascript的作用域又是词法性质的。这意味着函数运行在定义它的作用域中,而不是在调用它的作用域中。把这两个因素结合起来,就能通过把变量包裹在匿名函数中而对其加以保护。这样就可以创建类的私有属性。

 1 /*匿名函数的闭包示例*/
 2 var baz;
 3 (function(){
 4     var foo = 10;
 5     var bar = 2;
 6     baz = function(){
 7          return foo * bar; 
 8     };
 9 })();
10 
11 baz();//20  baz可以访问foo和baz  尽管它在匿名函数之外执行

四、对象的易变性

在javascript中,一切都是对象(除了三种元素类型,即便是这些类型,在必要的时候也会自动包装为对象),而且所有对象都是易变的。这也意味着可以对先前定义的类和实例化的对象进行修改。

 

本章主要javascript设计模式开遍,主要介绍了javascript作为弱类型语言的一些特性,为后续的章节打基础做铺垫。

 

posted @ 2012-04-15 21:17  行陌路  阅读(350)  评论(0编辑  收藏  举报