JavaScript里的对象就是普通名值对的集合。创建一个普通对象有两种方式。第一种方式是:
var obj = new Object;
第二种方式是:
var obj = {};
也可以这样创建一个完整的对象:
obj = { name: { first: 'Gandalf', last: 'the Grey' }, address: 'Middle Earth'};
可以看到,声明JavaScript对象时,键值对中的键就是对象的属性,值就是对应属性的值。在本书中,我们创建的所有的类,如Stack
、Set
、LinkedList
、Dictionary
、Tree
、Graph
等,都是JavaScript对象。
在面向对象编程(OOP)中,对象是类的实例。一个类定义了对象的特征。我们会创建很多类来表示算法和数据结构。例如我们声明了一个类来表示书:
function Book(title, pages, isbn){ this.title = title; this.pages = pages; this.isbn = isbn;}
用下面的代码实例化这个类:
var book = new Book('title', 'pag', 'isbn');
然后,我们可以访问和修改对象的属性:
console.log(book.title); //输出书名book.title = 'new title'; //修改书名console.log(book.title); //输出新的书名
类可以包含函数。可以声明和使用函数,如下所示:
Book.prototype.printTitle = function{ console.log(this.title);};book.printTitle;
也可以直接在类的定义里声明函数:
function Book(title, pages, isbn){ this.title = title; this.pages = pages; this.isbn = isbn; this.printIsbn = function{ console.log(this.isbn); }}book.printIsbn;
在原型的例子里,
printTitle
函数只会创建一次,在所有实例中共享。如果在类的定义里声明,就像前面的例子一样,则每个实例都会创建自己的函数副本。使用原型方法可以节约内存和降低实例化的开销。不过原型方法只能声明公共函数和属性,而类定义可以声明只在类的内部访问的私有函数和属性。ECMAScript 6引入了一套既像类定义又基于原型的简化语法。稍后我们会进一步讨论。