iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
Modern Web

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

追求JS小姊姊系列 Day19 -- 工具力,原來如此:原型與原型鍊。

  • 分享至 

  • xImage
  •  

前情提要:

建構式模式加上new是很擅長創造的能力。

:這能力也太強了吧,所以new是只有你才會嗎?

(傳出熟悉的聲音)

阿物件:在討論這件事,還記得在前面有說過,不論是鄭列的那些能力,或是我還沒展現的能力,背後都是有血繼限界這件事?
:所以你會什麼? 血輪眼?


該來說明的能力觸發方式

妳各位還記得鄭列之前使用各種的工具力嗎?

忘了工具力可看:追求JS小姊姊系列 Day6 -- 鄭列展現的工具力(上)

現在我們要來說明他是如何啟動能力的

let x  = ["tool"]; // 假設他是鄭列喔

//能力觸發方式: .

//以快速整理雜物的方法為例:
x.sort();

看到這裡,如果之前有認真看的讀者應該會說:
不是啊那個時候明明是寫Array.prototype.sort();


你的能力是不是你的能力?hasOwnProperty()

變數本身是否具有這個能力,可透過hasOwnProperty來檢查:true代表有,false則代表沒有。

let x  = ["tool"]; // 假設他是鄭列喔

//幫鄭列增加一個屬性:工具人的自我宣告
x.isTool = "對啊,我是工具人";
//檢查這個能力是不是它的
x.hasOwnProperty("isTool");

sort呢?

let x  = ["tool"]; // 假設他是鄭列喔

//檢查這個能力是不是它的
x.hasOwnProperty("sort");

什麼?!那他怎麼這麼會收東西呢?


血繼限界的源頭 -- 物件原型 prototype

我們平常使用的許多屬性與方法
其實是由原型prototype提供,像是Array的各種方法就是由Array.prototype提供(如圖)

不論你是用下面任一種方法建立陣列:

  1. 建構式 + new
  2. 字面值[]

都是原型(prototype)實例(instance),所以都會從對應的原型(prototype) 取用方法。

那要怎麼取用呢?

想知更多字面值知識,可參考隊友所寫:初學者跪著學JavaScript Day9:讓我困惑的Literals

血繼限界的牽絆 --原型鍊 prototype chain

這些自己沒有的能力,事實上都是透過所謂的原型鍊 prototype chain ,去往物件原型prototype 去找,怎麼做呢?

proto
也就是當我們使用一個方法時,背後實際長得跟我們所見的不太一樣。

sort()方法為例:

let a = [3,1,2]
a.sort()

在JS引擎看來實際是這樣 (但平常不會這樣寫)。

Array.prototype.sort.call(a,undefined);

原型鍊到底多長?

以下以Array為例

[] 
[].__proto__ //Array 的 prototype
[].__proto__.__proto__ //object 的 prototype
[].__proto__.__proto__.__proto__ //null

有錯的話,歡迎交流!我會很感謝 /images/emoticon/emoticon25.gif
-- to be continued --


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


reference:

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


上一篇
追求JS小姊姊系列 Day18 -- 方函式的能力展現:第三型態 Constructor function 登場
下一篇
追求JS小姊姊系列 Day20 -- 工具力,原來如此:繼承。
系列文
追求JS小姊姊30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言