- 私有變量在js中是個什么概念。當下我的認識是var所定義的變量,實際可以理解為屬性和方法,或者單單是臨時存儲器,不歸屬任何對象。
一個聲明函數:
function a(){
var v = "bc";
}
這樣定義的變量v有以下特征:
- 只有當a函數被執行的時候,即添加尾括號調用,內部才會開始v的聲明(預處理)及賦值的操作(執行)。
- 用后即毀,再不占用內存。
- 閉包的情況會常駐內存,直到閉包結束。
- console.dir打印函數v變量不可見。
- a函數的prototype是個Object對象,而Function是Function對象,Array是Array對象。因此只有Function一個原函數的prototype才是Function對象。普通函數可以作為構造器使用源於對函數的繼承。
測試:
將函數a的prototype及__proto__都賦值為null。則成了一個既無公有屬性的父類,又成了一個無原型繼承的子類。進行new操作以后,內部結構:

這就意味着new 實例化操作構建了一個新對象,來自原始對象Object。構造函數提供的僅僅是初始化的功能。真正構建實例對象是由new Object完成的。
- 構造函數初始化,可以遺傳給后代的屬性方法或變量是prototype這個自有原型庫,它跟自己的__proto__隱藏原型鏈無關(函數的__proto__代表的是自己這個函數的方法、屬性來源,其后代不具有它遺傳來的方法、屬性),當實例化一個對象后,該prototype就是新實例的__proto__。
- 添加入函數的靜態屬性方法,也即使用func.xxx實際是對自身功能的擴充,即對函數功能的擴充,不會進入prototype庫進行繼承,實例跟添加的屬性或方法互不影響。

-
添加的私有方法無論函數自身還是實例化對象都無法直接訪問。函數調用可采用返回值間接訪問,而實例化對象該值不在繼承之列,但在實例化的同時給構造函數傳參,私有變量可以被傳遞給對外開放的公有變量訪問,實際還是函數調用訪問而非實例訪問,在成為實例對象以后私有變量是不存在的,調用結束函數銷毀,靜態方法同樣,隨着函數的銷毀而銷毀。但公有方法因為this的指向變了,綁定到了實例對象上去繼續存在。

- Javascript function中的this指針很關鍵,如果沒有的話,那就是局部變量或局部函數。
