Javascript中可以使用new操作符來建立一個對象,那麼系統是如何使用new操作符來建立對象的呢?我們來看下流程:
- 首先需要定義一個類;
- 使用new操作符緊跟你所定義的函數來建立一個新的類的執行個體;
- 一旦Javascript編譯器碰到了new操作符,它就建立了一個空的執行個體變數,將類中prototype的所有屬性和方法複製到這個執行個體中,並將成員函數中所有的this指向這個新建立的執行個體;
- 接下來,執行緊跟在new操作符後面的那個函數;
- 當你執行完這個函數時,如果你試圖對一個不存在的屬性進行賦值,Javascript編譯器將自動為你在這個範圍內新建立這個屬性;
- 函數執行完畢後,將這個初始化完成的執行個體返回.
也就說:
JavaScript實際上在使用new時,執行了下列三個過程:
- 建立Null 物件;
- 將類的prototype中的屬性和方法複製到執行個體中;
- 將第一步建立的Null 物件做為類的參數調用類的建構函式.
例1:類比new
描述:建立一個類person,然後建立兩個變數p1和p,比較兩個變數最終產生的結果.
<script type="text/javascript"> function person(name,age){ this.name=name; this.age=age; } person.prototype={ ShowName:function(){ alert(this.name); }, ShowAge:function(){ alert(this.age); } } var p1= new person("ss",20); var p = {}; for(var v in person.prototype){ p[v]=person.prototype[v]; } person.call(p,"www",'29'); p.ShowName(); </script>
建立變數p的過程雖然沒有使用new,但是和p1是一樣的.見:
例2:重載
描述:定義類person.person類建構函式中有個ShowName方法,person.prototype上有個ShowName方法.執行個體究竟調用的是哪個方法呢?
答:調用的person類內部的ShowName方法.
定義類person如下:
function person(name,age){ this.name=name; this.age=age; this.ShowName=function(){ alert("這是建構函式中的ShowName:"+this.name); } } person.prototype={ ShowName:function(){ alert("這是Prototype中的ShowName:"+this.name); }, ShowAge:function(){ alert(this.age); } }
執行個體化過程:
var p = {}; for(var v in person.prototype){ p[v]=person.prototype[v]; } //執行完for語句,p已經具備了ShowName方法.可取消下述注釋,測試結果 //執行輸出: // 這是Prototype中的ShowName:undefined //p.ShowName(); //因為person函數中存在下列代碼: // this.ShowName={} //所以執行完此函數後 //變數p的ShowName變數被重新指向新的函數.原來的指向無處可尋 person.call(p,"www",29); //輸出: // 這是這是建構函式中的ShowName:www p.ShowName();