建構函式建立私有變數(防繼承)
先寫一個建構函式
function NumberCount() { this.number = 500 return { getNumber: ()=> { return this.number } } }
let n = new NumberCount;
console.log(n.getNumber()) // 500
console.log(n.number) // undefined
這樣就建立了函式的私有變數
為什麼?
函式物件的定義是:具有 [[call]] 私有欄位的物件,構造器物件的定義是:具有[[construct]]的物件。
換句話說任何物件實現了[[call]]就是函式物件,可以當做函式被呼叫,實現了[[construct]]就是構造器物件,可以作為構造器被呼叫。 但是他們並不總是一致的 。
[[construct]]的執行大概有以下步驟
基於物件的原型Object.prototype建立一個新的物件,把this傳給[[call]]。如果[[call]]的返回值是一個物件,返回這個物件,如果返回不是物件,就返回基於原型建立的新的物件。
所以文章開頭的程式碼也就一目瞭然,為什麼通過getNumber能獲取到 直接n.number卻不能獲取到