javascript 新方向 (5)
在許多語言中都有都有介面的概念,我在學習 java 語言也是花一段時間才理解介面的作用以及如何使用介面,介面有時候一個規範或者說契約,如果想加入和使用我們就必須要實現或履行介面。介面讓我們的程式更加靈活,把一些實現丟擲去有使用者來具體實現。在 javascript 這門動態語言中是沒有介面概念的。
我們定義一個 Car 類,在建構函式定一個 wheels 的陣列,陣列包括 wheel 的例項,這裡額外說明一個在 java 語言中我們沒有的福利,就是在陣列元素後面可以隨意寫逗號,這是讓那些 java developer 開發所羨慕的。

在 java 語言我們為了格式好看或避免多些,通常會這樣處理陣列元素後面的逗號的。

我們這樣嘗試列印 car ,會提示我們 car 不是一個可以遍歷的.

在 javascript 中除了 5 基本資料型別,我們還有 Symbol 這個資料型別

ES6引入了一種新的原始資料型別Symbol,表示獨一無二的值。
有時,我們希望重新使用同一個Symbol值,Symbol.for方法可以做到這一點。接受一個字串作為引數,然後搜尋有沒有以該引數作為名稱的Symbol值。如果有,就返回這個Symbol值,否則就新建並返回一個以該字串為名稱的Symbol值。

我們列印一下,看一看我們通過Symbol.for 定義相同字串引數的Symbol 是相同的 Symbol 。這樣我們就可以利用 Symbol 來定義方法名稱來避免命名的衝突。

建立一個 Person 類,在類中定義一個簡單方法 play 輸出以下。

我們為實現介面效果,我們使用 Symbol.for 來定義一個 Symbol 來作為我們方法名。這樣我們方法名就是唯一的了。

我們在回來看我們 Car 類,如果我們想要 Car 是一個可遍歷的,在像 java 這樣的語言 Car 需要實現一個 Iteratorable 的介面,讓他具有可遍歷的能力。
在es6中,提供了for...of..迴圈,Iterator主要提供介面供其消費。Iterator介面其實就是提供一種統一的訪問機制,這種訪問機制就是for...of,當使用for..of時,該迴圈就會自動尋找Iterator介面。只要這種資料結構部署了Iterator,具體說就是隻要這種資料結構有Symbol.iterator這個屬性那麼就可以遍歷了。

這一次丟擲異常與之前有所不同,不是說 Car 不是一個可以遍歷的物件,而是說 iterator 方法返回不是一個物件。


那麼我們就按要求返回一個物件,再次嘗試執行一下。

這是丟擲異常又發生變化,說明有一個方法沒有定義。

那麼我們根據要求在返回的物件中定義一個 next 方法來返回一個物件,再次執行程式。這是程式雖然沒有報錯,但是就這樣執行下去,卡死了。

這是因為我們的 next 方法返回物件中缺少告知程式是否還有值,還是已經沒有下一個值的屬性,以及具體這個值是什麼。我們嘗試修改一下程式碼。

只有 done 為 true 的時候才會停止遍歷,如果我們一直賦值為 false 程式就會一直遍歷下去。

好吧,經過反覆的嘗試我想大家對[Symbol.iterator]這個介面用法已經有了比較透徹的瞭解了吧。

