通過javascript中的new認識基於原型的面向對象。

j
函數就是對象。
其實通常我們在javascript裏定義的一個函數,都對應着一個以這個函數體爲構造函數的對象。
而javascript與java不同的是,他是面向原形的面嚮對象語言。java是基於類的面嚮對象語言。
也就是說,可以通過對象來new出一個新的對象。
比如:定義 function fun(p1,p2){} 時, 實際上生成了一個Function類型(預定義類型)的對象,對象名叫fun,對象的構造函數就是這個函數的體. 
於是,也可以用另一種方式定義剛纔的函數(其實是對象)。
fun=new Function(‘p1,’p2’,…) ;(這種方式定義時,前面的參數都是函數的參數。只有最後一對 ‘’ 裏,寫入函數體)
對於這個對象,採用fun.var=“XXX”的方式,就可以爲對象增加一個屬性。而無須聲明。

從對象org 去new一個新對象時,首先調用該org的構造函數(函數org定義時的函數體爲對象 org的構造函數)。
然後將org對象的prototype屬性的子屬性(函數和變量)copy到新對象中。
還有構造函數裏以 this.XXX= [ function (){}或“xxx”] 形式定義的XXX屬性也copy到新對象中去。

當然在對象生成後,也可以另行添加屬性(即函數)。
一種方式是其父對象的prototype.xxx下添加,一種是其自己 self.xxx方式添加。
在搜索的時候,先搜索自身然後在搜索父對象的prototype下的屬性。即後者可以覆蓋前者。


  在JavaScript中,prototype對象是實現面向對象的一個重要機制。

  每個函數就是一個對象(Function),函數對象都有一個子對象 prototype對象,類是以函數的形式來定義的。prototype表示該函數的原型,也表示一個類的成員的集合。
  在通過new創建一個類的實例對象的時候,prototype對象的成員都成爲實例化對象的成員。
  1、該對象被類所引用,只有函數對象纔可引用;
  2、在new實例化後,其成員被實例化,實例對象方可調用。
  同時,函數是一個對象,函數對象若直接聲明成員,不用被實例化即可調用。

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