class field所帶來的一些問題

2021-09-24 16:40:01 字數 1482 閱讀 8893

public field 和private field組成了class field,這篇文章不講private field ,只談public field所帶來的問題

我會根據例子來講解,這樣會更好理解一些

class safeuser 

}

上面**非常簡單,就是宣告了乙個safeuser類,接下來我們根據public field來簡化一下**

class safeuser
這兩種方式有什麼區別呢?

下面這種方式在執行的時候呼叫了

object.defineproperty
為當前的例項新增屬性,當然上面那種寫法也是在當前例項上新增password屬性

在一般的情況下,這兩種寫法是沒什麼差別的,但在一些特殊的情況下,下面的寫法會出現問題。舉個例子

class user 

set password(val)

}class safeuser extends user

}

父類 user,子類safeuser,我們的目的在於當safeuser的例項每次改變時,都列印出change password,(在真實的開發中,可能是以日誌的形式記錄下來)

看下效果

我們發現當改變password的時候,確實會列印出'change password'

不僅如此,在生成乙個例項的時候,就已經列印出來'change password',這是因為呼叫super,初始化了父類,

接下來this.password = 『1234』,觸發了set函式,也就是觸發了父類的set方法,為當前例項新增了_password屬性

所以password不是inst的屬性,是它從原型上找的,_password才是inst自身的屬性,下圖就驗證了我們的說法

如果把safeuser改為下面那種public field的寫法,就會出現問題

class user 

set password(val)

}class safeuser extends user

具體的差別,我們從下面的截圖就可以看出來

改變password沒有觸發set函式

為什麼會這樣呢?

就向上面說的,內部相當於執行了

object.defineproperty
既然inst自己有password屬性,就不會訪問父級的password

猛龍所帶來的震動

最近真的是完全沉浸入了學習之中,不覺之間發現高中那個對學院派路線不屑一顧的我已經成為了其中乙個典型代表。席間休息的時候猛龍打我 了,恍惚之間一連猜錯了幾次最後才知道是猛龍。猛龍與我先策聊了一下之後便開始很自然地過渡到大學畢業找工作這個話題,先前我以為猛龍只是在談他自己的事,後來猛龍才轉到了關於畢業生...

NRV優化所帶來的困惑

我們知道要了解編譯器在做什麼,nrv優化應該是乙個無法避免的問題,下面來看乙個例子 include iostream 從這兩個程式的執行來看nrv優化好像並不是那麼如你想象中的好 using namespace std include class text private double arry 1...

ToList 所帶來的效能影響

前幾天優化師弟寫的 有乙個地方給我留下很深刻的印象,就是我發現他總是將plinq的結果tolist 然後再返回給主程式,對於這一點我十分不解,於是去問他是什麼原因,得到的答案很幽默 因為習慣。有時候對於方法的不甚了解加上 習慣 往往是程式效能和穩定性終結者,就拿這個case來說吧,原始 如下 var...