物件
JavaScript是物件導向程式(true?),所以可以建立物件。 建立方式舉例如下:這是一個客戶點的物件,裡面只包含數個變數。
- 使用var來宣告。
- 變數給值是使用冒號(:),而變數之間是用逗點(,)分開。
-
我們可以試著使用,加上以下的程式碼:
console.log(Node.x + " " + Node.y + " " + Node.demand + " " + Node.isVisited);
可以在console看到結果。 -
若是在物件之外要改變裡面的值,可以使用點(.),
例如在印出之前加上
Node.x = 80;
可以看到結果的x變成了80。 -
另一個方式是使用中括號[變數名]來取得變數,例如再加上
Node["isVisited"] = true;
再看一次結果。
物件方法
物件內除了有變數,還可以加上方法,原則上就是加上函數,修改上例如下:
說明:
- 方法也算是一種變數,所以與變數間一樣用逗點(,)分開。 方法與方法之間也是使用逗點(,)分開。
-
需使用this關鍵字來取得物件內的參數。即使是方法。關於this的說明如下:
- 在方法中的this表示此方法的擁有者,在這裡便是Node物件。所以this.x指的便是Node.x, 若是將this改為Node也可運行,若都沒有則出現錯誤。
- 如果不是在方法內,單獨使用this表示的是全域物件,在瀏覽器中代表的是window,例如: 此會顯示Window。
- 通常定義物件內的函數為方法(method),非物件內的函數為函數(function),事實上所有的函數都是方法,因為函數是屬於全域物件(window)的方法。
call & apply
call()跟apply()兩個函數是用來呼叫一個方法,而輸入參數是物件。例如以下的例子:
- 建立三個物件,其中arc的方法endpoint將使用到node的變數。
- 使用call()或是apply()來取得物件內的變數將其用於方法內。
- 兩者的不同處是apply()接受參數為陣列型態。例如我們將上例的arc改寫如下並呼叫: 可以看到apply需使用陣列型態。
new
除了上述的方式建立物件,也可以使用new關鍵字來建立,舉例如下: 看結果可知nodeC為一新建立的物件。
如果我們使用等號(=)將一個物件指派給另一個變數,原則上是傳址,也就是此時兩者為同一物件, 改變其中一個的數值會跟著改變另一個。例如:
將nodeA指派給變數nodeD,改變nodeD的x,y值,根據結果可知nodeA的x,y值也跟著更改了。
for in
若是要traverse整個物件,可以使用for in語法,例如: 這個方式可以很便利的依次取得物件中的所有變數名稱(當然包含方法)。若是要得到變數的值,可以將console.log(i);修改為console.log(Node[i]);,這是前述取得物件變數值得方式,那為何不使用Node.i呢?那是因為取得的i的資料型態是字串,所以會出錯。
adding & deleting properties
JavaScript允許我們自外部加上屬性,即使原來物件中並無定義也可以,例如修改之前的nodeC物件如下: 可以看到物件多了一個demand的屬性。若是要加入新的方法也可以,舉例如下:
新的方法info()被加入到nodeC內了。
可以刪除屬性,使用delete關鍵字,例如:
如果是繼承而來的物件,則只會刪除此物件內屬性,若是被繼承的物件,則繼承的物件內屬性都會被刪除。
constructor
通常我們還是希望對於同一類別的物件建立一個設計圖,此稱constructor,然後根據此類別來產生物件。在JavaScript使用關鍵字function來達成。例如:
根據此方式便可以建立物件。但是不可以在外部增加constructor的屬性,如此物件無法取得該屬性。
class
JavaScript尚可使用class關鍵字來建立物件。 >>
使用此方式可將constructor與methods分開來寫,容易分類,跟其他語言例如Java的寫法較為類似。此外,尚可跟Java一樣使用extends關鍵字做繼承。 >>
使用super關鍵字來呼叫父類別。
Prototype
原型(Prototype)是所有物件繼承鏈的最頂端,之前提到不能在外部增加constructor的屬性,但是可以修改其原型(Prototype)來達到修改的目的。例如:
我們在剛才的constructor的prototype加上一個新的變數跟一個新的方法。
Built-in Constructors
JavaScript包含數個內建的constructors供我們直接使用,計有:
- Object(): {}
- String(): ""
- Number(): 0
- Boolean(): true
- Array(): []
- RegExp(): /()/
- Function(): function(){}
- Date():