我們回到我們創建溫斯頓的計劃 但我添加了一個新物件類型霍伯 Hopper 因為霍伯感覺有點被冷落 現在 我用定義溫斯頓方式同樣定義霍伯 以構造函數 (constructor function) 開始 採用相同的屬性 有繪製和談話的功能 我還添加了另一種 名為何瑞 (Horray) 的方法 因為霍伯真的很喜歡慶祝而溫斯頓很不喜歡 現在在函數的下方 我創建了兩個新的霍伯物件: 小霍伯和大霍伯 繪製出他們 並呼叫 其中一個和另一端的何瑞通話 所以這是相當奇妙的 現在 如果我們看一下此處程式 你可能會注意到一些有趣的事情 霍伯的程式和溫斯頓的程式非常類似 尤其是看這個構造函數 我不知道你是否還記得 那跟溫斯頓構造函數是完全相同的程式 然後這個通話函數跟溫斯頓通話函數 也是完全相同的程式 他們也都有繪製函數 因此 這兩個物件類型有很多共同的東西 那是有道理的 因為霍伯和溫斯頓 在我們世界裡是非常相似的物件類型 如果你想想現實世界 電腦外 大多數物件類型共享相似處 就像在動物王國 所有的動物在某些方面都很相似 而動物有不同類型 像人類一樣 人類共享這些相似之處 但也有自己 獨特的相似之處 因此 我們可以說 人類物件類型從動物物件類型繼承功能 我們不是從無開始 我們在原有動物功能之上添加功能 就像所有的動物會發出聲響 人類也會說話 所以物件繼承這一概念 在程式編碼中非常有用 我們可以在 JavaScript 創建 物件繼承鏈 要做到這一點 先想想我們物件類型是要分享什麼 然後想出一個名字 創建一個新的物件類型 代表基本物件 讓我們稱呼他們為動物 所以我們說 var Creature = ... 現在 我們需要構造函數 讓我們去偷霍伯的函數 因為它跟溫斯頓是一樣的 好的 接著... 讓我們來看看 現在 我們要... 我們接下來要怎麼辦? 也許我們要添加 “通話” 函數 通話函數 我們可以偷霍伯的 但是當然 我們需要有動物的原型來代替 好吧 酷 所以現在我們有 動物物件類型 但是 我們需要真正告訴霍伯 霍伯的功能實際上應該根基於動物 因此 我們可以透過這裡寫這行 我們會說 Hopper.prototype = Object.create(Creature.prototype) 所以這行做的是告訴 Javascript 霍伯原型的依據 所有霍伯的功能立足在 Creature.prototype 動物原型 而它意味著 程式每一次在霍伯身上找函數 它會先看霍伯的原型 但如果沒有找到 就會先找看看有沒有在動物原型裡 這就是我們所說的原型鏈 現在 做了這一點後 我們應該可以 刪除霍伯通話函數 因為它在動物中存在 它是在原型鏈前面 讓我們試試吧 準備好了? ♪咚咚咚♪ 有效!因為它在動物原型裡發現替代品 呃 讓我們嘗試刪除溫斯頓 好的 沒效 它說 “物件有沒有方法談話” 為什麼是這樣? 我們有溫斯頓構造和繪圖函數 我們拿走了通話 好吧 你注意到我們實際上忘了說 溫斯頓的原型是基於動物的原型 因此 我們需要一個非常重要的防線 Winston.prototype = object.create (Creature.prototype) 成了! 同時注意一些重要的東西 這行是在構造函數之後 在添加任何東西給溫斯頓原型之前 通常要告訴它 馬上: 你的初始原型將是依據這個 但是 我們繼續添加更多東西至原型 因為可能有一些事情 是溫斯頓所特有的 或霍伯獨有的 動物沒有 這很酷 可以自己定義這些東西 好的 現在 我們看這個 仍然有一些重複的程式 構造函數的程式 對?我們有三倍多的程式 所以 我們可以直接刪除嗎? 讓我們試試 好的 嗯... 似乎沒效 因為我們的霍伯在上方 它似乎把自己都忘了 這是因為 Javascript 不假設 你想要同樣的構造函數 即使你想依據它的原型 它讓你定義自己物件的構造 但它也給你一個簡單的方法 從次物件來呼叫構造函數 能做到這一點的方法是:Creature.call(this,nickname,age,x,y) 這是什麼呢 - 請注意它有效 好極了 它實際上做的是 呼叫動物函數 -- 構造函數 呼叫函數 並說 好吧 你應該呼叫這個構造函數 如同它被霍伯物件呼叫 並且 如果它用這些參數來呼叫 這些是霍伯通話得到的參數 這將終結這段程式執行 如同它是在這裡 這正是我們想要的 而它有效! 我們可以繼續前進 複製這行到溫斯頓構造 它有效 好極了! 好的 因此 檢查了這一點 我們都在一個單一基本物件包裹共同屬性與功能: Creature 我們已經從基本物件延伸做了兩個物件類型 他們繼承了一些功能 但也自行添加功能 而關於這個很酷的事是 我們可以在一個地方更改共享功能 就像如果我們想再次更改年齡 我們可以說 “+歳” 酷 現在人人都有幾 “歳” 在它的結尾 或者 我們可以改變 “說話” 函數 像 “suppp” 嗚! 現在溫斯頓和霍伯都在說 “SUP” 所以 現在你看到了 怎樣創造物件類型和繼承物件類型 你可以開始想想 這在 繪圖和動畫 模擬和遊戲 如何有用 例如 也許你有一個遊戲 有許多類型的字符 它們都可以跑 但只有其中的一些可以跳 對於繼承物件類型 這是個完美的地方 但我敢說 你能想到更多好方法