[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.98,0:00:03.39,Default,,0000,0000,0000,,我們回到我們創建溫斯頓的計劃\N Dialogue: 0,0:00:03.39,0:00:06.34,Default,,0000,0000,0000,,但我添加了一個新物件類型霍伯 Hopper Dialogue: 0,0:00:06.34,0:00:08.74,Default,,0000,0000,0000,,因為霍伯感覺有點被冷落 Dialogue: 0,0:00:08.74,0:00:11.92,Default,,0000,0000,0000,,現在 我用定義溫斯頓方式同樣定義霍伯 Dialogue: 0,0:00:11.92,0:00:17.08,Default,,0000,0000,0000,,以構造函數 (constructor function) 開始 \N採用相同的屬性 有繪製和談話的功能 Dialogue: 0,0:00:17.08,0:00:20.93,Default,,0000,0000,0000,,我還添加了另一種\N名為何瑞 (Horray) 的方法 Dialogue: 0,0:00:20.93,0:00:25.33,Default,,0000,0000,0000,,因為霍伯真的很喜歡慶祝而溫斯頓很不喜歡 Dialogue: 0,0:00:25.33,0:00:29.92,Default,,0000,0000,0000,,現在在函數的下方\N我創建了兩個新的霍伯物件: Dialogue: 0,0:00:29.92,0:00:31.52,Default,,0000,0000,0000,,小霍伯和大霍伯 Dialogue: 0,0:00:31.52,0:00:36.32,Default,,0000,0000,0000,,繪製出他們 並呼叫\N其中一個和另一端的何瑞通話 Dialogue: 0,0:00:36.32,0:00:40.28,Default,,0000,0000,0000,,所以這是相當奇妙的\N現在 如果我們看一下此處程式 Dialogue: 0,0:00:40.28,0:00:42.65,Default,,0000,0000,0000,,你可能會注意到一些有趣的事情 Dialogue: 0,0:00:42.65,0:00:47.41,Default,,0000,0000,0000,,霍伯的程式和溫斯頓的程式非常類似 Dialogue: 0,0:00:47.41,0:00:50.28,Default,,0000,0000,0000,,尤其是看這個構造函數\N我不知道你是否還記得 Dialogue: 0,0:00:50.28,0:00:54.80,Default,,0000,0000,0000,,那跟溫斯頓構造函數是完全相同的程式 Dialogue: 0,0:00:54.80,0:00:58.49,Default,,0000,0000,0000,,然後這個通話函數跟溫斯頓通話函數 Dialogue: 0,0:00:58.49,0:01:03.90,Default,,0000,0000,0000,,也是完全相同的程式\N他們也都有繪製函數 Dialogue: 0,0:01:03.90,0:01:07.16,Default,,0000,0000,0000,,因此 這兩個物件類型有很多共同的東西 Dialogue: 0,0:01:07.16,0:01:09.63,Default,,0000,0000,0000,,那是有道理的 因為霍伯和溫斯頓 Dialogue: 0,0:01:09.63,0:01:13.30,Default,,0000,0000,0000,,在我們世界裡是非常相似的物件類型 Dialogue: 0,0:01:13.30,0:01:17.88,Default,,0000,0000,0000,,如果你想想現實世界 電腦外 Dialogue: 0,0:01:17.88,0:01:20.81,Default,,0000,0000,0000,,大多數物件類型共享相似處 Dialogue: 0,0:01:20.81,0:01:25.54,Default,,0000,0000,0000,,就像在動物王國\N所有的動物在某些方面都很相似 Dialogue: 0,0:01:25.54,0:01:29.68,Default,,0000,0000,0000,,而動物有不同類型 像人類一樣 Dialogue: 0,0:01:29.68,0:01:34.03,Default,,0000,0000,0000,,人類共享這些相似之處 但也有自己\N獨特的相似之處 Dialogue: 0,0:01:34.03,0:01:36.34,Default,,0000,0000,0000,,因此 我們可以說 Dialogue: 0,0:01:36.34,0:01:41.53,Default,,0000,0000,0000,,人類物件類型從動物物件類型繼承功能 Dialogue: 0,0:01:41.53,0:01:43.63,Default,,0000,0000,0000,,我們不是從無開始 Dialogue: 0,0:01:43.63,0:01:46.81,Default,,0000,0000,0000,,我們在原有動物功能之上添加功能 Dialogue: 0,0:01:46.81,0:01:51.80,Default,,0000,0000,0000,,就像所有的動物會發出聲響\N人類也會說話 Dialogue: 0,0:01:51.80,0:01:56.36,Default,,0000,0000,0000,,所以物件繼承這一概念\N在程式編碼中非常有用 Dialogue: 0,0:01:56.36,0:02:00.72,Default,,0000,0000,0000,,我們可以在 JavaScript 創建\N物件繼承鏈 Dialogue: 0,0:02:00.72,0:02:05.04,Default,,0000,0000,0000,,要做到這一點\N先想想我們物件類型是要分享什麼 Dialogue: 0,0:02:05.04,0:02:11.31,Default,,0000,0000,0000,,然後想出一個名字 創建一個新的物件類型 \N代表基本物件 Dialogue: 0,0:02:11.31,0:02:13.74,Default,,0000,0000,0000,,讓我們稱呼他們為動物 Dialogue: 0,0:02:13.74,0:02:16.30,Default,,0000,0000,0000,,所以我們說 var Creature = ... Dialogue: 0,0:02:16.30,0:02:18.26,Default,,0000,0000,0000,,現在 我們需要構造函數 Dialogue: 0,0:02:18.26,0:02:23.66,Default,,0000,0000,0000,,讓我們去偷霍伯的函數\N因為它跟溫斯頓是一樣的 好的 Dialogue: 0,0:02:23.66,0:02:29.40,Default,,0000,0000,0000,,接著... 讓我們來看看 現在 我們要... \N我們接下來要怎麼辦? Dialogue: 0,0:02:29.40,0:02:33.24,Default,,0000,0000,0000,,也許我們要添加 “通話” 函數 Dialogue: 0,0:02:33.24,0:02:36.37,Default,,0000,0000,0000,,通話函數 我們可以偷霍伯的 Dialogue: 0,0:02:36.37,0:02:39.94,Default,,0000,0000,0000,,但是當然 我們需要有動物的原型來代替 Dialogue: 0,0:02:39.94,0:02:45.79,Default,,0000,0000,0000,,好吧 酷 所以現在我們有\N動物物件類型 Dialogue: 0,0:02:45.79,0:02:48.34,Default,,0000,0000,0000,,但是 我們需要真正告訴霍伯 Dialogue: 0,0:02:48.34,0:02:52.64,Default,,0000,0000,0000,,霍伯的功能實際上應該根基於動物 Dialogue: 0,0:02:52.64,0:02:56.18,Default,,0000,0000,0000,,因此 我們可以透過這裡寫這行 我們會說 Dialogue: 0,0:02:56.18,0:03:05.00,Default,,0000,0000,0000,,Hopper.prototype =\NObject.create(Creature.prototype) Dialogue: 0,0:03:05.00,0:03:09.93,Default,,0000,0000,0000,,所以這行做的是告訴 Javascript \N霍伯原型的依據 Dialogue: 0,0:03:09.93,0:03:15.77,Default,,0000,0000,0000,,所有霍伯的功能立足在 Creature.prototype \N動物原型 Dialogue: 0,0:03:15.77,0:03:19.98,Default,,0000,0000,0000,,而它意味著 程式每一次在霍伯身上找函數 Dialogue: 0,0:03:19.98,0:03:23.74,Default,,0000,0000,0000,,它會先看霍伯的原型 \N但如果沒有找到 Dialogue: 0,0:03:23.74,0:03:29.74,Default,,0000,0000,0000,,就會先找看看有沒有在動物原型裡 \N這就是我們所說的原型鏈 Dialogue: 0,0:03:29.75,0:03:32.37,Default,,0000,0000,0000,,現在 做了這一點後\N我們應該可以 Dialogue: 0,0:03:32.37,0:03:37.56,Default,,0000,0000,0000,,刪除霍伯通話函數 因為它在動物中存在 Dialogue: 0,0:03:37.56,0:03:41.99,Default,,0000,0000,0000,,它是在原型鏈前面 \N讓我們試試吧 準備好了? ♪咚咚咚♪ Dialogue: 0,0:03:41.99,0:03:48.60,Default,,0000,0000,0000,,有效!因為它在動物原型裡發現替代品 Dialogue: 0,0:03:48.99,0:03:53.42,Default,,0000,0000,0000,,呃 讓我們嘗試刪除溫斯頓 Dialogue: 0,0:03:53.42,0:03:58.42,Default,,0000,0000,0000,,好的 沒效 它說\N“物件有沒有方法談話” Dialogue: 0,0:03:58.42,0:04:00.91,Default,,0000,0000,0000,,為什麼是這樣? 我們有溫斯頓構造和繪圖函數 Dialogue: 0,0:04:00.91,0:04:02.87,Default,,0000,0000,0000,,我們拿走了通話 Dialogue: 0,0:04:02.87,0:04:05.72,Default,,0000,0000,0000,,好吧 你注意到我們實際上忘了說\N Dialogue: 0,0:04:05.72,0:04:08.62,Default,,0000,0000,0000,,溫斯頓的原型是基於動物的原型 Dialogue: 0,0:04:08.62,0:04:14.37,Default,,0000,0000,0000,,因此 我們需要一個非常重要的防線 \NWinston.prototype = object.create Dialogue: 0,0:04:14.37,0:04:17.73,Default,,0000,0000,0000,,(Creature.prototype) Dialogue: 0,0:04:17.78,0:04:20.22,Default,,0000,0000,0000,,成了! \N同時注意一些重要的東西 Dialogue: 0,0:04:20.22,0:04:23.32,Default,,0000,0000,0000,,這行是在構造函數之後 Dialogue: 0,0:04:23.32,0:04:27.29,Default,,0000,0000,0000,,在添加任何東西給溫斯頓原型之前 Dialogue: 0,0:04:27.29,0:04:30.06,Default,,0000,0000,0000,,通常要告訴它 Dialogue: 0,0:04:30.06,0:04:32.02,Default,,0000,0000,0000,,馬上: Dialogue: 0,0:04:32.02,0:04:34.20,Default,,0000,0000,0000,,你的初始原型將是依據這個 Dialogue: 0,0:04:34.20,0:04:37.22,Default,,0000,0000,0000,,但是 我們繼續添加更多東西至原型 Dialogue: 0,0:04:37.22,0:04:39.00,Default,,0000,0000,0000,,因為可能有一些事情 Dialogue: 0,0:04:39.00,0:04:42.88,Default,,0000,0000,0000,,是溫斯頓所特有的 或霍伯獨有的 動物沒有 Dialogue: 0,0:04:42.89,0:04:46.36,Default,,0000,0000,0000,,這很酷 可以自己定義這些東西 Dialogue: 0,0:04:46.36,0:04:51.53,Default,,0000,0000,0000,,好的 現在 我們看這個\N仍然有一些重複的程式 構造函數的程式 Dialogue: 0,0:04:51.53,0:04:54.32,Default,,0000,0000,0000,,對?我們有三倍多的程式 Dialogue: 0,0:04:54.32,0:04:57.85,Default,,0000,0000,0000,,所以 我們可以直接刪除嗎? Dialogue: 0,0:04:57.85,0:04:59.89,Default,,0000,0000,0000,,讓我們試試 Dialogue: 0,0:04:59.89,0:05:03.51,Default,,0000,0000,0000,,好的 嗯... 似乎沒效 Dialogue: 0,0:05:03.51,0:05:05.65,Default,,0000,0000,0000,,因為我們的霍伯在上方 Dialogue: 0,0:05:05.65,0:05:08.08,Default,,0000,0000,0000,,它似乎把自己都忘了 Dialogue: 0,0:05:08.08,0:05:12.60,Default,,0000,0000,0000,,這是因為 Javascript 不假設\N你想要同樣的構造函數\N Dialogue: 0,0:05:12.60,0:05:15.26,Default,,0000,0000,0000,,即使你想依據它的原型 Dialogue: 0,0:05:15.26,0:05:19.36,Default,,0000,0000,0000,,它讓你定義自己物件的構造 Dialogue: 0,0:05:19.36,0:05:26.27,Default,,0000,0000,0000,,但它也給你一個簡單的方法\N從次物件來呼叫構造函數 Dialogue: 0,0:05:26.27,0:05:36.54,Default,,0000,0000,0000,,能做到這一點的方法是:Creature.call(this,nickname,age,x,y) Dialogue: 0,0:05:36.54,0:05:39.36,Default,,0000,0000,0000,,這是什麼呢 - 請注意它有效 好極了 Dialogue: 0,0:05:39.36,0:05:44.43,Default,,0000,0000,0000,,它實際上做的是 呼叫動物函數 -- 構造函數 Dialogue: 0,0:05:44.43,0:05:47.07,Default,,0000,0000,0000,,呼叫函數 並說 Dialogue: 0,0:05:47.07,0:05:49.75,Default,,0000,0000,0000,,好吧 你應該呼叫這個構造函數 Dialogue: 0,0:05:49.75,0:05:54.12,Default,,0000,0000,0000,,如同它被霍伯物件呼叫 Dialogue: 0,0:05:54.12,0:05:56.97,Default,,0000,0000,0000,,並且 如果它用這些參數來呼叫 Dialogue: 0,0:05:56.97,0:05:59.55,Default,,0000,0000,0000,,這些是霍伯通話得到的參數 Dialogue: 0,0:05:59.55,0:06:03.86,Default,,0000,0000,0000,,這將終結這段程式執行 如同它是在這裡 Dialogue: 0,0:06:03.86,0:06:06.81,Default,,0000,0000,0000,,這正是我們想要的 而它有效! Dialogue: 0,0:06:06.81,0:06:09.08,Default,,0000,0000,0000,,我們可以繼續前進 Dialogue: 0,0:06:09.08,0:06:14.86,Default,,0000,0000,0000,,複製這行到溫斯頓構造 Dialogue: 0,0:06:14.86,0:06:17.17,Default,,0000,0000,0000,,它有效 好極了! Dialogue: 0,0:06:17.17,0:06:18.78,Default,,0000,0000,0000,,好的 因此 檢查了這一點 \N Dialogue: 0,0:06:18.78,0:06:24.91,Default,,0000,0000,0000,,我們都在一個單一基本物件包裹共同屬性與功能:\NCreature Dialogue: 0,0:06:24.91,0:06:28.21,Default,,0000,0000,0000,,我們已經從基本物件延伸做了兩個物件類型\N Dialogue: 0,0:06:28.21,0:06:31.93,Default,,0000,0000,0000,,他們繼承了一些功能 但也自行添加功能 Dialogue: 0,0:06:31.93,0:06:33.31,Default,,0000,0000,0000,,而關於這個很酷的事是 Dialogue: 0,0:06:33.31,0:06:36.49,Default,,0000,0000,0000,,我們可以在一個地方更改共享功能 Dialogue: 0,0:06:36.49,0:06:41.20,Default,,0000,0000,0000,,就像如果我們想再次更改年齡 \N我們可以說 “+歳” Dialogue: 0,0:06:41.20,0:06:44.19,Default,,0000,0000,0000,,酷 現在人人都有幾 “歳” 在它的結尾 Dialogue: 0,0:06:44.19,0:06:49.48,Default,,0000,0000,0000,,或者 我們可以改變 “說話” 函數\N像 “suppp” 嗚! Dialogue: 0,0:06:49.48,0:06:53.24,Default,,0000,0000,0000,,現在溫斯頓和霍伯都在說 “SUP” Dialogue: 0,0:06:53.24,0:06:56.66,Default,,0000,0000,0000,,所以 現在你看到了 \N怎樣創造物件類型和繼承物件類型 Dialogue: 0,0:06:56.66,0:07:01.60,Default,,0000,0000,0000,,你可以開始想想 這在\N繪圖和動畫 模擬和遊戲 如何有用 Dialogue: 0,0:07:01.60,0:07:05.29,Default,,0000,0000,0000,,例如 也許你有一個遊戲 \N有許多類型的字符 Dialogue: 0,0:07:05.29,0:07:07.68,Default,,0000,0000,0000,,它們都可以跑\N但只有其中的一些可以跳 Dialogue: 0,0:07:07.68,0:07:12.27,Default,,0000,0000,0000,,對於繼承物件類型 這是個完美的地方 Dialogue: 0,0:07:12.27,0:07:15.97,Default,,0000,0000,0000,,但我敢說 你能想到更多好方法