Class - 類創(chuàng)建
Class類實現(xiàn)了在JavaScript中聲明一個新的類, 并通過構(gòu)造函數(shù)實例化這個類的機(jī)制。通過使用Class.create()方法, 你實際上聲明了一個新的類, 并定義了一個initialize()方法作為構(gòu)造函數(shù), 一旦你在這個聲明的類的prototype中實現(xiàn)了改該方法, 你就可以使用new操作符來創(chuàng)建并實例化一個類。
Knowledge Prepare - 知識準(zhǔn)備
在JavaScript中, 當(dāng)你定義了一個新的函數(shù), 你實際上聲明了一個新的類, 而這個函數(shù)本身就相當(dāng)于類的構(gòu)造函數(shù)。 下面的代碼向你展示了兩種不同的方式來創(chuàng)建一個新的Person類, 而Person.prototype的定義也緊跟在函數(shù)定義之后。
var Person = function(name) { // 一個匿名函數(shù), 并將這個函數(shù)賦值給一個Person變量, 此時Person成為一個類 this.name = name; } function Person(name) { // 直接定義一個叫做Person的函數(shù)表示Person類 this.name = name; } Person.prototype = { // 定義Person的prototype域 printName: function() { // 定義一個print函數(shù) alert(this.name); } }
當(dāng)你通過函數(shù)的方式聲明了一個類之后, 你就可以通過new操作符來實例化這個類。這樣, 你就可以調(diào)用類的成員函數(shù)來完成你的邏輯。
var person = new Person("Joe Smith"); // 使用new操作符來新建一個Person的實例, 并賦給變量person person.printName(); // person就可以看作是一個實例的引用(reference), 所以可以通過這個引用來調(diào)用Person類中的成員函數(shù)
我們來總結(jié)一下創(chuàng)建一個新的類的實例的整個流程和步驟:
1. 通過定義一個函數(shù)的方式(匿名或者實名)來聲明一個新的類.
2. 如果有必要, 定義這個新的類的prototype域.
3. 使用new操作符緊跟你所定義的函數(shù)來創(chuàng)建一個新的類的實例. 一旦JavaScript編譯器碰到了new操作符, 它實際上創(chuàng)建了一個空的類實例變量.
4. 將所有這個類的prototype域中的屬性與方法復(fù)制到這個新的實例中, 并將其成員函數(shù)中所有的this指針指向這個新創(chuàng)建的實例.
5. 接下來, 執(zhí)行緊跟在new操作符后面的那個函數(shù).
6. 當(dāng)你執(zhí)行這個函數(shù)時, 如果你試圖對一個不存在的屬性進(jìn)行賦值, JavaScript編譯器將自動為你在這個實例范圍內(nèi)新創(chuàng)建這個屬性.
7. 函數(shù)執(zhí)行完畢后, 將這個初始化完成的實例返回.
在Prototype中, 使用Class對象, 你可以以一個比較簡單的方式來聲明一個新的對象。通過使用Class.create(), prototype為你創(chuàng)建了一個默認(rèn)的構(gòu)造函數(shù)initialize(), 一旦你實現(xiàn)這一函數(shù), 就可以以一個類似Java中構(gòu)造函數(shù)的方式來創(chuàng)建一個新的類的實例。
Source View - 源碼解析
var Class = { // 全局靜態(tài)類, 用于聲明一個新的類并提供構(gòu)造函數(shù)支持 create: function() { return function() { // 返回一個函數(shù), 代表著這個新聲明的類的構(gòu)造函數(shù) // 一個命名為initialize的函數(shù)將被這個類實現(xiàn)作為類的構(gòu)造函數(shù) this.initialize.apply(this, arguments);// initialize函數(shù)將在你實例化一個變量的時候被調(diào)用執(zhí)行(即上面7個步驟中的第5步) } } }
Field & Function Reference - 屬性方法一覽
Class ( 靜態(tài) )
Method / Property | Kind | Arguments | Description |
---|---|---|---|
create() | 靜態(tài)方法 | / | 用于聲明一個新的類并提供了一個名為initialize構(gòu)造函數(shù)支持 |
Analysis & Usage - 分析與使用
通過Class類, 你可以很容易地使用構(gòu)造函數(shù)的方式創(chuàng)建一個新的類, 這對于Java程序員來說或許更加容易被接受。下面我們列出了Java和JavaScript各自聲明和創(chuàng)建一個新的類的代碼對比, 我們可以看到, 他們是如此相似:
var Person = Class.create(); // 類的聲明 |public class Person { // 類的聲明 Person.prototype = { | private String name; initialize: function(name) { // 構(gòu)造函數(shù) | public Person(String name){ // 構(gòu)造函數(shù) this.name = name; | this.name = name; } | } printName: function() { // 成員函數(shù) | public void printName(){ // 成員函數(shù) alert(this.name); | System.out.println(name); } | } } |} var person = new Person("Joe Smith");// 創(chuàng)建實例 |Person person = new Person("Joe Smith");// 創(chuàng)建實例 person.printName(); // 函數(shù)調(diào)用 |person.printName(); // 函數(shù)調(diào)用
------君臨天下,舍我其誰------