上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)引入了一套既像类定义又基于原型的简化语法。稍后我们会进一步讨论。