iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
Modern Web

追求JS小姊姊30天系列 第 20

追求JS小姊姊系列 Day20 -- 工具力,原來如此:繼承。

  • 分享至 

  • xImage
  •  

前情提要:

在上一集解釋了工具力的來源

方函式:還記得之前提到的建構式模式嗎?
只要提供一個原型,就能大量產生的那個能力。其實,除了東西能複製,人也是可以的喔

function TopToolMan(task,remember){
    this.task = task || {daily:["洗衣服","載男友"],weekily:["買當週消耗品"]};
    this.remember = remember;
    this.forbid = ["不可以色色","不可以妄想"]
    this.log = function(){
    console.log("不知為何要存在")
    }
}
let x = new TopToolMan("採買","不需要");

:你的內在(原型)看起來還挺壓抑的...

方函式:...那不是重點,重點是我所創造出來的人,若沒有特定要求(如下圖)

let doNothingClone = new TopToolMan();

還是會保有我的基本記憶與能力。這就是透過繼承來達成。

這樣子,今天不論她需要的是:

  1. 有人去台北排O果新機
let goToTaipeiToBuyPhone = new TopToolMan("買手機","順便買伴手禮");

他記憶的任務跟會記得的就是你所交代(賦予) 的內容。

  1. 又需要人去屏東買豬腳(?)
let x = new TopToolMan("採買","不需要");

方函式:同一個時間下,要幾個人就能有幾個人(實例),而且都能去處理不同的事情。

想建構複製人的你,要知道的小缺點

每個複製人內都一個的log function,雖然是在做同一件事,但都會個別佔用了空間,所以可以視為不同的function

那要怎麼辦? 新增在原型上

function TopToolMan(task,remember){
    this.task = task || {daily:["洗衣服","載男友"],weekily:["買當週消耗品"]};
    this.remember = remember;
    this.forbided = ["不可以色色","不可以妄想"]
    
    topToolMan.prototype.log = function(){
    console.log("不知為何要存在")
    }
}

上面的行為是等於在原型上新增一個屬性或方法
這樣一來,所有TopToolMan創建的instance,都能透過血繼限界中(prototype chain)取得這個能力與想法。


背後比較正經的原理

一切原理的起因,要說到JavaScript最初的設計由來:所謂物件導向的設計

以下會依序講述我目前所能理解的部分:

JS設計是以原型為基礎的物件導向(OOP)設計

先知道:物件是最基本的程式單位。

原型的本身
還記得昨天的文章測試:原型鍊的頂部為Object.prototype這件事嗎?

console.log(typeof Object.prototype); // "Object"

原型本身也是一個Object,符合所謂的物件導向設計的:物件是最基本的程式單位。


原型為基礎的程式設計,並沒有真正的Class

所以無法透過類的層級,來達成屬性、方法的繼承, 那JS怎麼做到繼承這件事呢? 你至少可以先知道new扮演了什麼角色。

重新理解new

我們再來製作一個複製人,這次來看看:
實際上在創造每個複製人時,會依序執行以下的步驟

function TopToolMan(task,remember){
    this.task = task || {daily:["洗衣服","載男友"],weekily:["買當週消耗品"]};
    this.remember = remember;
    this.forbided = ["不可以色色","不可以妄想"]
    
    topToolMan.prototype.log = function(){
    console.log("不知為何要存在")
    }
}
let x = new topToolMan("採買","不需要");
  1. 創出一個新的object,名稱為 x
  2. 接著x__proto__會指向TopToolManprototype,才能繼承原型鍊。
  3. this會指向x,呼叫topToolMan這個建構函式
  4. 回傳x

小結

  1. JS是以原型物件為基礎 的程式設計,所以它的繼承方式是透過原型鍊(Prototype chain)、new來實現
  2. 執行new這個動作時,實際上會讓物件與原型連結。

-- to be continued --


那今天就到這邊摟!
每天的休息,是為了後面的追求,明天見。


reference:

你懂 JavaScript 嗎?#19 原型(Prototype)
[筆記] 了解JavaScript中原型(prototype)、原型鍊(prototype chain)和繼承(inheritance)的概念
該來理解 JavaScript 的原型鍊了


上一篇
追求JS小姊姊系列 Day19 -- 工具力,原來如此:原型與原型鍊。
下一篇
追求JS小姊姊系列 Day21 -- 工具人、姐妹不只身份的差別(上): 基本型別包裹器(wrapper object)
系列文
追求JS小姊姊30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
CathyShen
iT邦新手 4 級 ‧ 2021-10-06 15:48:08

需要老鄉幫忙買豬腳

嗨老鄉
先看是不是吃同一家再決定(?)

我要留言

立即登入留言