建構函式建立私有變數(防繼承)

2021-09-12 17:03:18 字數 613 閱讀 3292

先寫乙個建構函式

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...