建構式模式加上
new
是很擅長創造的能力。
我:這能力也太強了吧,所以new
是只有你才會嗎?
(傳出熟悉的聲音)
阿物件:在討論這件事,還記得在前面有說過,不論是鄭列的那些能力,或是我還沒展現的能力,背後都是有血繼限界這件事?
我:所以你會什麼? 血輪眼?
妳各位還記得鄭列之前使用各種的工具力嗎?
現在我們要來說明他是如何啟動能力的
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
提供(如圖)
不論你是用下面任一種方法建立陣列:
new
[]
都是原型(prototype)的實例(instance),所以都會從對應的原型(prototype) 取用方法。
那要怎麼取用呢?
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
有錯的話,歡迎交流!我會很感謝
-- to be continued --
那今天就到這邊摟!
每天的休息,是為了後面的追求,明天見。
你懂 JavaScript 嗎?#19 原型(Prototype)
[筆記] 了解JavaScript中原型(prototype)、原型鍊(prototype chain)和繼承(inheritance)的概念