学习JavaScript数据结构与算法(第3版)
上QQ阅读APP看书,第一时间看更新

1.6 JavaScript面向对象编程

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();

在prototype的例子里,printTitle函数只会创建一次,在所有实例中共享。如果在类的定义里声明,就像前面的例子一样,则每个实例都会创建自己的函数副本。使用prototype方法可以节约内存和降低实例化的开销。不过prototype方法只能声明public函数和属性,而类定义可以声明只在类的内部访问的private函数和属性。ECMAScript 2015(ES6)引入了一套既像类定义又基于原型的简化语法。稍后我们会进一步讨论。