JavaScript Design Pattern - 一. The Language
JavaScript本身并不是完全的面向对象的语言,它和C++/Java的相似程度还没有和Lisp等函数式编程语言来得接近。 有人说,JavaScript是披着面向对象的语法糖衣的函数式编程语言。
想要学好JavaScript, 对它的某些特性就不得不有所了解:
1. 灵活性
JavaScript提供了许多灵活的方式来实现某个特定的功能,你可以用简单的,面向进程的方式来实现,你也可以用很复杂的,面向对象的方法。
举个例子,如果你曾经是一个C开发人员:
/* Start and stop animations using functions. */ function startAnimation() { ... } function stopAnimation() { ... }
又或者你是个Java程序员:
/* Anim class. */ var Anim = function() { ... }; Anim.prototype.start = function() { ... }; Anim.prototype.stop = function() { ... }; /* Usage. */ var myAnim = new Anim(); myAnim.start(); ... myAnim.stop();
2. 弱类型语言
和C++/Java不同,JavaScript是弱类型语言,这意味着你可以为某个声明的变量赋任意值。
JavaScript有两种数据类型: 基本数据类型(number,boolean和string), 引用数据类型(包括对象,数组已经方法)。当然还有null以及undefined。虽然对于数据类型的分类跟C++/Java有些不同,但事实上在使用中,你并不会感觉到太多这种差异。同时,对于传参方式,传值或是传址,JavaScript同C++/Java并无二致。
3. 函数是一类对象(functions as first-class objects)
对于这句话我也不知道该如何翻译,于是把英文原文贴过来。许多面向对象语言宣称“万事万物皆对象”,但事实上方法/函数并没有被归类于对象。而在JavaScript中,函数同对象是同一等级的事物。
如同我们可以创建匿名类一样,我们也可以创建匿名函数:
(function() { var foo = 10; var bar = 2; alert(foo * bar); })();
4. 对象的可变性
你可以为一个函数赋予一个属性:
function displayError(message) { displayError.numTimesExecuted++; alert(message); }; displayError.numTimesExecuted = 0;
5. 高阶函数
一个高阶函数可以将函数作为参数,也可以返回一个函数。此特性让 JavaScript 程序员可以用 Java 语言所不能提供的方法来操纵函数。
hot = function hot() { alert('Hot.') } cold = function cold() { alert('Cold.') } var current; function swap(hot, cold) { if(current == hot) { current = cold } else { current = hot } return current; }
6.对象模型
JavaScript 用嵌套函数表示对象, 它基于原型或现有的对象的实例来构造对象,而非基于类模板。
Animal = function() { this.name = "nobody" this.speak = function () { return "Who am I?" } } Dog = function() { this.speak = function() { return "Woof!" } } Dog.prototype = new Animal();
弄清楚以上的这些概念,可以说对JavaScript就有了一定的了解了。