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)
constructor
沒有報錯。如果昨天你有理解 prototype chain,應該會知道 沿著虛線找
的邏輯,這邊也同樣可以應用。
deepJS
有沒有 constructor 。 (沒有找到)有找到
constructor。這時候的 constructor 是一條從 Workshop.prototype 指回去 Workshop 的方向。
所以 (Workshop.prototype).constructor 就是 Workshop
很多底線,口語上要描述會變成 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 。
如果 function 已經用 bind() 綁定,可以重新綁定嗎?
如果在 arrow function 裡面宣告一個變數,這個變數的 scope 是 arrow function 還是 parent scope ?
有
lexical scope 。lexical scope 和 this 是不一樣的東西,
前者是靜態的scope,後者是 JavaScript 模仿動態 scope 的一種行為 。
如果 this 是一個 callback function , this 的值是取決於哪個 higher order function 嗎?
誰呼叫他
,所以這個例子是對的
。function return function 是另一種技巧,之後考慮寫 functional programming 的系列文章,不過就沒有那麼硬一天一篇了,也還在考慮要不要投技術週刊可以人有幫忙審稿 XDD。
使用 dunderproto (proto) 到底會發生什麼事?
Object.setPrototypeOf()
或是 Object.getPrototypeOf()
面試
會想電你的時候用到
,如果面試的考官說他們有在實際 prod 上寫這種語法(直接用 dunderproto 不用暴露好的 API),建議你不要去那種公司。什麼時候會有圖上兩條方向的線,什麼時候只有單向的虛線?
- 一般的 function : function declaration , function expression , named function, anonymous function 都有 prototype
- arrow function 沒有 prototype (方形)物件,所以你用 new 去呼叫 arrow function ,會報錯。
super keyword 是什麼?
不是
動態綁定,所以創造的時候所有東西都要寫好。create object literal with method, linked to the object