读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作为弱类型语言的一些特性,为后续的章节打基础做铺垫。