讀古今文學網 > 學習JavaScript數據結構與算法(第2版) > 1.6 JavaScript面向對像編程 >

1.6 JavaScript面向對像編程

JavaScript裡的對象就是普通名值對的集合。創建一個普通對像有兩種方式。第一種方式是:

var obj = new Object;

  

第二種方式是:

var obj = {};

  

也可以這樣創建一個完整的對象:

obj = {
  name: {
    first: 'Gandalf',
    last: 'the Grey'
  },
  address: 'Middle Earth'
};

  

可以看到,聲明JavaScript對像時,鍵值對中的鍵就是對象的屬性,值就是對應屬性的值。在本書中,我們創建的所有的類,如StackSetLinkedListDictionaryTreeGraph等,都是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引入了一套既像類定義又基於原型的簡化語法。稍後我們會進一步討論。