0:00:01.184,0:00:03.425
現在你們已學習到有關[br]Javascript的基礎知識
0:00:03.425,0:00:06.180
我要教你們一個很酷的方式[br]來使用JavaScript
0:00:06.180,0:00:09.555
那就是"物件導向程式設計"
0:00:09.555,0:00:12.156
首先我們要理解一下[br]它為什麼很實用
0:00:12.298,0:00:15.858
所以我撰寫了一個程式[br]讓它變得更”物件導向”後
0:00:15.858,0:00:17.218
就會變得更好
0:00:17.247,0:00:19.967
這真是一個很酷的程式
0:00:19.967,0:00:24.007
在頂部我有兩個變數[br]裡面儲存了簡單的物件實體語法
0:00:24.363,0:00:28.244
物件實體語法是以前[br]我們所學到的其中一種物件
0:00:28.535,0:00:30.634
即是我們構建了兩個大括號
0:00:30.634,0:00:33.455
然後把這些屬性名稱[br]及數值全部放進去
0:00:33.762,0:00:37.292
因此我們有兩個物件實體語法變數
0:00:37.292,0:00:40.776
在這裡我們有這個函數[br]drawWinston,它需要一個引數
0:00:40.776,0:00:45.115
然後再繪畫出引數
0:00:45.115,0:00:47.847
並根據物件的 x及 y 屬性繪畫圖像
0:00:47.847,0:00:52.900
然後根據那個物件的暱稱[br]及年齡屬性添加字幕
0:00:52.900,0:00:55.538
最後在底部我們呼叫 drawWinston
0:00:55.538,0:00:57.289
到青少年及成人中
0:00:57.331,0:01:00.010
這會使它顯示出來
0:01:00.862,0:01:05.501
很贊哦。假如我們到這裡[br]看看這些物件實體語法
0:01:05.617,0:01:10.606
就會注意到它們的外觀其實真的很相似
0:01:11.188,0:01:15.608
都具有相同系列的屬性[br]且兩者也可以使用相同的
0:01:15.608,0:01:17.493
drawWinston函數
0:01:17.891,0:01:21.630
其實如果你們想像一下[br]他們真的都在描述
0:01:21.630,0:01:23.910
某類型的Winston,對不對?
0:01:24.240,0:01:28.840
我們可以這樣想 或者在世上[br]存在著這抽象類型的Winston
0:01:28.840,0:01:32.771
而每一 Winston 也具有[br]相同系列的屬性,如暱稱
0:01:32.771,0:01:36.991
年齡、x 與 y
0:01:36.991,0:01:42.090
我們剛在這裡完成的是[br]建立了兩個 Winston實例
0:01:42.090,0:01:44.821
來描述特定的 Winston
0:01:45.001,0:01:48.350
因此這是青少年Winston[br]而這是成人Winston
0:01:48.350,0:01:52.892
但是,他們兩者真的十分相似
0:01:52.892,0:01:55.002
且很多跟他們有關的事也相近
0:01:55.002,0:01:57.712
如果你們仔細想想世間上[br]也有很多不同的運作方式
0:01:57.712,0:02:01.341
我們有這些抽象數據類型[br]如人類及群眾
0:02:01.341,0:02:03.714
我們都只是特定的實例
0:02:03.714,0:02:05.712
擁有我們自己小小的屬性
0:02:06.041,0:02:10.362
現在我們實際上可以使用[br]物件導向技術 Javascript
0:02:10.362,0:02:17.463
使這些 Winston 變數成為[br]Winston 物件的正式實例
0:02:17.921,0:02:21.963
使他們知道正在共享這些共同的東西
0:02:21.963,0:02:25.091
要這樣做的話我們需要做的[br]第一件事就是實際地描述
0:02:25.091,0:02:30.372
這個抽象數據類型 Winston[br]因此我們要作出一個變數
0:02:30.372,0:02:35.111
你們要把數據類型儲存在變數[br]Winston 變數,而我們用大寫W
0:02:35.220,0:02:38.630
因為我們的物件類型[br]通常由大寫字母開始
0:02:38.630,0:02:41.810
我們把它設置為函數
0:02:41.810,0:02:46.950
而這個函數是一個特定函數[br]我們把它叫做 "建構子函數"
0:02:46.950,0:02:49.471
因為我們每一次要建立[br]全新的 Winston 實例時
0:02:49.471,0:02:52.110
這就是被呼叫的東西
0:02:52.110,0:02:55.369
當我們要建立青少年 Winston[br]就會呼叫這個函數
0:02:55.369,0:02:57.989
或要建立成年人 Winston[br]就會呼叫這個函數
0:02:57.997,0:03:03.037
這意味著這個函數要了解[br]任何需要知道的引數
0:03:03.037,0:03:06.267
以作出完整的 Winston
0:03:06.457,0:03:10.433
在這種情況下,它需要知道[br]暱稱、年齡、x 與 y
0:03:10.718,0:03:15.249
現在,當我們收到那些引數後[br]就需要做一些事情
0:03:15.249,0:03:20.919
我們需要把這些資料[br]實際地連接到 Winston 物件
0:03:21.389,0:03:26.660
因此我們要使用全新的特別關鍵字"this"
0:03:26.660,0:03:29.018
而"this"是指目前的物件實例
0:03:29.018,0:03:31.800
我們會說 this.nickname[br]而它會說”好吧”
0:03:31.800,0:03:34.169
而這個物件的暱稱屬性相等於
0:03:34.169,0:03:38.030
任何被傳到建構子函數的,好囉?
0:03:38.451,0:03:42.381
this.age 相等於傳入的年齡
0:03:42.449,0:03:44.138
而 this.x 相等於傳入的 x
0:03:44.138,0:03:47.328
而 this.y 相等於傳入的 y
0:03:47.466,0:03:52.537
現在我們有這個名為[br]Winston 的抽象數據類型
0:03:52.838,0:03:56.488
而它帶有建構子函數[br]我們可以使用它來建立全新的Winston
0:03:56.488,0:03:58.778
讓我們嘗試使用它吧!
0:03:59.476,0:04:03.236
我們要重新建立 WinstonTeen
0:04:03.236,0:04:05.314
但是這一次我們用WinstonTeen等於
0:04:05.314,0:04:10.365
這裡不用大括號 我們會說[br]"等於全新的 Winston"
0:04:10.607,0:04:14.107
我們會說 "我們正在嘗試[br]建立全新的 Winston 實例"
0:04:14.107,0:04:16.346
然後我們要傳入需要的資料
0:04:16.346,0:04:21.478
"Winsteen",15, 20, 50[br]好囉!
0:04:22.246,0:04:26.306
然後我們刪除舊資料[br]因為已不再需要它們了
0:04:26.306,0:04:30.097
好了吧? 現在我們建立了[br]全新的Winsteen
0:04:31.207,0:04:35.806
我們會說[br]winstonAdult = new Winston()
0:04:35.960,0:04:39.502
當然他的名字是"Mr. Winst-a-lot"[br]聽起來甜美可人的名字
0:04:39.502,0:04:45.342
他30歲,在 229 及50[br]好,然後我們就可以刪除
0:04:45.342,0:04:49.923
這個物件實體語法[br]很好! 我們的代碼仍然正常運作
0:04:50.712,0:04:53.651
我們在這裡所做的就是[br]我們說好吧 就有這個
0:04:53.651,0:04:57.161
Winston 抽象類型數據
0:04:57.852,0:05:03.073
而我們能建立全新的 Winston 實例
0:05:03.073,0:05:05.161
且擁有這些特定的屬性
0:05:05.161,0:05:08.661
我們把這些屬性儲存在內
0:05:08.661,0:05:12.284
而記憶是非常重要的[br]因些你們知道內裡
0:05:12.284,0:05:14.154
有這個[br]this.nickname, this.age
0:05:14.325,0:05:19.642
如果意外地丟失這個年齡[br]你們注意到它會說 "未定義"
0:05:20.249,0:05:22.958
因為在這裡 drawWinston 函數
0:05:22.958,0:05:28.321
期待著任何傳入的物件[br]都帶有年齡屬性
0:05:28.321,0:05:30.803
如果我們沒有 this.age
0:05:30.803,0:05:34.372
那麼它也沒有年齡屬性[br]我們傳入了建構子函數
0:05:34.372,0:05:37.231
但是並沒有用它做任何事情
0:05:37.231,0:05:39.452
我們必須使用 "this"關鍵字[br]實際地連接到物件
0:05:39.621,0:05:41.542
那我們就把它添加回去
0:05:41.542,0:05:45.111
現在你們會想代碼已正常運作
0:05:45.111,0:05:50.321
但是......我們只是完成了前面做過的事
0:05:50.457,0:05:53.936
但這裡是一件很酷的事[br]我們所有的 Winstons
0:05:53.936,0:05:56.086
經過相同的建構子函數
0:05:56.086,0:05:59.656
如果我們想要進行更新[br]我們是真的可以修改它們的
0:05:59.656,0:06:01.167
有關 Winston 的一些東西...
0:06:01.167,0:06:04.217
所有的 Winstons[br]就在這裡,可能是年齡
0:06:04.217,0:06:06.107
事實上我們想說 "歲數"
0:06:06.107,0:06:09.838
我們只須放在這裡[br]現在所有 Winstons 說
0:06:09.838,0:06:12.879
"15歲"、 "30歲" 對嗎?
0:06:12.879,0:06:14.977
因此他們只取用獨特的部分
0:06:14.977,0:06:17.417
他們也有共享的東西
0:06:17.417,0:06:20.107
而物件導向程式設計最棒的地方
0:06:20.107,0:06:22.107
就是在這世上有這類的物件
0:06:22.107,0:06:26.108
你們能夠實際地建立這些物件的實例
0:06:26.108,0:06:28.428
而還有跟他們相似的東西
0:06:28.428,0:06:30.408
例如他們擁有相同的屬性
0:06:30.408,0:06:32.409
且有不同的東西
0:06:32.409,0:06:35.508
例如這個屬性事實上跟其他的屬性[br]帶有不同的數值,對不對?
0:06:35.508,0:06:38.748
你們知道嘛,我們可以[br]使用相同的行為
0:06:38.748,0:06:40.508
像呼叫相同的函數
0:06:40.508,0:06:43.069
以類似的方式使用它們
0:06:43.069,0:06:45.979
這是一些有關物件導向[br]程式設計很棒的東西
0:06:45.979,0:06:48.548
而你們將會看到更多很棒的東西
0:06:48.548,0:06:50.148
敬請繼續收看