js中原型和閉包的理解

原型

javascript中有對象。
還有一種特殊的對象,叫方法
這裏js需要解決一個數據共享的問題。
作爲方法,需要提供一個空間來存放共享的數據,給通過該方法生成的對象使用。
所以有

var Fn = function(){};
Fn.propertype.age=12;

這裏的propertype就是放置共享數據的空間。
然後通過該方法生成對象。
var fn = new Fn();
對於對象,需要拿到方法的共享數據,這裏proto屬性就是剛纔方法共享數據空間的地址,所以對象此時如果自己沒有定義屬性的話,就會藉助proto屬性,定位到生成該對象的方法的共享屬性空間拿到共享屬性。
這個公式說明就是
Fn.propertype = fn.__proto__
所以:
alert(fn.age);
小總結:
方法需要提供一個propertype地址當成共享空間,放置共享數據。
實例對象需要通過proto屬性訪問共享的數據。

深入一點說明,這個共享空間的地址結構是什麼樣呢。
先說明,這個共享的空間是一個對象。

一般有2部分組成

  1. 自定義屬性,比如age這些
  2. constructor屬性指向方法
  3. proto屬性
這個共享空間是一個對象,它也有__proto__屬性,這個指向Function的共享空間,Function共享空間的__proto__屬性指向Function的共享空間,形成一個環形。

如下圖:
原型的理解

更詳細可以點擊這裏

閉包

如果瞭解閉包,就需要明白變量的作用域
閉包可以把是外部作用域訪問方法內部作用域的橋樑
可以包變量保持在內存中

當函數名後加上括號時,通常會執行函數體本身。如果函數有返回值時,此時會得到函數的返回值;
當函數名後不加括號時,其實質上是一個函數指針,只是用於找到函數體的位置,不會直接執行函數體;

參考博客

深入理解javascript原型和閉包(完結)
JavaScript中函數作爲參數進行傳遞時的括號問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章