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引入了一套既像類定義又基於原型的簡化語法。稍後我們會進一步討論。