在JavaScript中, 當你定義了一個新的函數, 你實際上聲明了一個新的類別, 而這個函數本身就相當於類別的建構子。下面的程式碼向你展示了兩種不同的方式來建立一個新的Person類別, 而Person.prototype的定義也緊接在函數定義之後。
var Person = function(name) { // 一个匿名函数, 并将这个函数赋值给一个Person变量, 此时Person成为一个类 this.name = name; } function Person(name) { // 直接定义一个叫做Person的函数表示Person类 this.name = name; } Person.prototype = { // 定义Person的prototype域 printName: function() { // 定义一个print函数 alert(this.name); } }
當你透過函數的方式宣告了一個類別之後, 你就可以透過new運算子來實例化這個類別。這樣, 你就可以呼叫類別的成員函數來完成你的邏輯。
var person = new Person("Joe Smith"); // 使用new操作符来新建一个Person的实例, 并赋给变量person person.printName(); // person就可以看作是一个实例的引用(reference), 所以可以通过这个引用来调用Person类中的成员函数
我們來總結一下建立一個新的類別的實例的整個流程和步驟:
1. 定義一個函數的方式(匿名或實名)來宣告一個新的類別.
2. 如果有必要, 定義這個新的類別的prototype域.
3. 使用new操作符緊跟著你所定義的函數來創建一個新的類別的實例. 一旦JavaScript編譯器碰到了new操作符, 它實際上創建了一個空的類別實例變數.
4. 將所有這個類別的prototype域中的屬性與方法複製到這個新的實例中, 並將其成員函數中所有的this指針指向這個新創建的實例.
5. 接下來, 執行緊跟在new操作符後面的那個函數.
6. 當你執行這個函數時, 如果你試圖對一個不存在的屬性進行賦值, JavaScript編譯器將自動為你在這個實例範圍內新創建這個屬性.
7. 函數執行完畢後, 將這個初始化完成的實例回傳.
在Prototype中, 使用Class物件, 你可以以一個比較簡單的方式來宣告一個新的物件。透過使用Class.create(), prototype為你創建了一個預設的構造函數initialize(), 一旦你實現這一函數, 就可以以一個類似Java中構造函數的方式來創建一個新的類的實例。