iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
0
Modern Web

跟著 YDKJS 作者 Kyle Simpson 打造全新 JavaScript Mindset系列 第 29

[day28] YDKJS (Prototypes) : Prototype Chain 的 __proto__

  • 分享至 

  • twitterImage
  •  

constructor 也有 Prototype Chain 的特性。


function Workshop(teacher) {
	this.teacher = teacher ;
}
Workshop.prototype.ask = function (question) {
	console.log(this.teacher, question)
}

var deepJS = new Workshop("Kyle");

console.log(deepJS.constructor === Workshop) ;

console.log(deepJS.__proto__ === Workshop.prototype);
console.log(Object.getPrototypeOf(deepJS) === Workshop.prototype)

line 10

  • line 10 出現的 constructor 沒有報錯。
  • Why?

如果昨天你有理解 prototype chain,應該會知道 沿著虛線找 的邏輯,這邊也同樣可以應用。

  • 找 deepJS 有沒有 constructor 。
  1. 先找自己 deepJS 有沒有 constructor 。 (沒有找到)
  2. 沒有就沿著方向往上找,找到 Workshop.prototype 有找到 constructor。

這時候的 constructor 是一條從 Workshop.prototype 指回去 Workshop 的方向。
所以 (Workshop.prototype).constructor 就是 Workshop

複習昨天:
[day27] YDKJS (Prototypes) : 圖解 Prototype Chain

line 12

很多底線,口語上要描述會變成 deepJS dot Underscore Underscore proto Underscore Underscore
太麻煩了,你可以說 double Underscore proto,但還有一個更短的說法,
就簡稱 dunder proto

所以 line 12 的 deepJS 看起來像是要找有 dunderproto 這個屬性(property),
因為 deepJS 沒有,所以會沿著線往上指向 WorkShop.prototype
(此時為 true)

但假若 WorkShop.prototype 也找不到,其實還會再往上找,這時候往上就是 Object.prototype 了。

很神奇的是,Object.prototype 有這個 dunderproto 東西,
dunderproto 其實不是 屬性(property),是一個 getter function !

Object.prototype 有一個 getter function 叫做 dunderproto


// 不過值是 null ,因為是最上層了

綜合來看,line 12 直接找到 Object.prototype 裡面的 getter function 叫做 dunderproto
此時,如果 getter function 裡面有 this ,其實 this 還是 line 12 的 deepJS 。

Q&A

  • 如果 function 已經用 bind() 綁定,可以重新綁定嗎?

  • 如果在 arrow function 裡面宣告一個變數,這個變數的 scope 是 arrow function 還是 parent scope ?

    • Arrow function lexical scope 。
    • 但 Arrow function 沒有定義 this keyword。

    lexical scope 和 this 是不一樣的東西,
    前者是靜態的scope,後者是 JavaScript 模仿動態 scope 的一種行為 。

  • 如果 this 是一個 callback function , this 的值是取決於哪個 higher order function 嗎?

    • this 只看 誰呼叫他,所以這個例子是對的
    • higher order function 比如 someFunction.map( ...[cb]... )

    function return function 是另一種技巧,之後考慮寫 functional programming 的系列文章,不過就沒有那麼硬一天一篇了,也還在考慮要不要投技術週刊可以人有幫忙審稿 XDD。

  • 使用 dunderproto (proto) 到底會發生什麼事?

    • dunderproto 有一個 getter 和 setter ,其實就是圖上用來畫線的方法。
    • 不過建議使用暴露好的 API Object.setPrototypeOf() 或是 Object.getPrototypeOf()
    • 個人理解(非 Kyle):正常人不會使用到,只有面試會想電你的時候用到,如果面試的考官說他們有在實際 prod 上寫這種語法(直接用 dunderproto 不用暴露好的 API),建議你不要去那種公司。
  • 什麼時候會有圖上兩條方向的線,什麼時候只有單向的虛線?

    • 一般的 function 都有 someFunction.prototype (黃色的方形物件,太重要沒有具體名字那個東西) , 但是 arrow function 沒有。
    • 一般的 function : function declaration , function expression , named function, anonymous function 都有 prototype
    • arrow function 沒有 prototype (方形)物件,所以你用 new 去呼叫 arrow function ,會報錯。
  • super keyword 是什麼?

    • super keyword 可以用外部的 class ,技術上來說可以透過 prototype chain 連結到任意 class
    • 注意:super keyword 不是 動態綁定,所以創造的時候所有東西都要寫好。

    create object literal with method, linked to the object


上一篇
[day27] YDKJS (Prototypes) : 圖解 Prototype Chain
下一篇
[day29] YDKJS (Prototypes) : Prototype (Delegation pattern) 實踐 Inheritance
系列文
跟著 YDKJS 作者 Kyle Simpson 打造全新 JavaScript Mindset31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言