先寫乙個建構函式
function numbercount()
}}
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卻不能獲取到
建構函式建立私有變數(防繼承)
先寫乙個建構函式 function numbercount let n new numbercount console.log n.getnumber 500 console.log n.number undefined 這樣就建立了函式的私有變數 函式物件的定義是 具有 call 私有欄位的物件,...
建構函式建立私有變數(防繼承)
先寫乙個建構函式 function numbercount let n new numbercount console.log n.getnumber 500 console.log n.number undefined 這樣就建立了函式的私有變數 函式物件的定義是 具有 call 私有欄位的物件,...
Java私有建構函式不能阻止繼承
下面是乙個呼叫已經私有化的單列的函式的列子.這裡用了靜態內部類,關鍵就是靜態內部類可以訪問外部類的私有建構函式。這種算是變種繼承吧。前提是可以在原來的單列類裡新增 class single public void runsinglemethod public static class evil ex...