## 前提
首先我們應該明白創建一個JS對象的具體實例是實例化的過程,而實例化是通過new關鍵字實現的,這個對象是含有constructor的,一般的核心對象都會具有constructor以便創建其實例。因此,如果要對我們自己創建的JS對象進行實例化的話,則這個對象必須具有constructor。
構造函數的基本架構為:
~~~
function myConstructor(a){
/*某些代碼*/
}
~~~
## 靜態成員
JS中的靜態成員是通過點操作符添加到對象實例中,并且只存在于對象的一個具體實例,不存在于構造函數中,因此通過new關鍵字創建的對象實例不具有原對象的靜態成員。
添加對象靜態成員的小例:
~~~
<script type="text/javascript">
var myObject = new Object();
//添加靜態屬性
myObject.name="lyg";
//添加靜態方法
myObject.alertName = function(){
alert(this.name);
}
//執行添加的靜態方法
myObject.alertName()
</script>
~~~
靜態成員只存在于對象的一個具體實例,不存在于構造函數中的實例:
~~~
<script type="text/javascript">
function myConstuctor(){
}
myConstuctor.myname = "lyg";
myConstuctor.alertName = function(){
alert(this.myname);
}
//myConstuctor.alertName();
var myObj = new myConstuctor();
myObj.alertName(); //這里會報錯
</script>
~~~
## 公有成員
能夠使實例化的對象包含的成員稱為公有成員,添加公有成員有兩種方法:在構造函數中用this關鍵字添加公有屬性或公有方法(特權成員);另外一種方法便是修改函數原型,即prototype屬性
添加對象公有成員的小例:
~~~
<script type="text/javascript">
function myConstuctor(){
this.message="abc";
}
var myObj = new myConstuctor();
//alert(myObj.message);
alert(myObj.myName); //這里將顯示undefined
myConstuctor.prototype.myName = 'lyg';
alert(myObj.myName); //這里顯示'lyg'
</script>
~~~
實例中也正說明了當修改一個對象的原型時,任何繼承該對象的對象和已經存在的所有實例都會繼承同樣的變化。而需要提及一點的是,公有成員只能在被實例化的實例中可用,而在構造函數自身中是無效的。
## 私有成員
在構造函數中定義的變量和函數成為私有成員,私有成員只有在構造函數中才能訪問,因此在實例化執行構造函數的過程中,將訪問其成員。
添加私有成員的小例:
~~~
<script type="text/javascript">
function myConstuctor(message){
this.message = message; //公有屬性
var myOwner = this; //私有屬性
function alertMessage(){ //私有方法
alert(myOwner.message);
}
alertMessage();
}
var myObj = new myConstuctor("Hello Wold"); //這里將彈出窗口顯示"Hello Wold"
</script>
~~~
## 特權成員
特權成員也屬于公有成員的一類,之前已有提及:在構造函數中用this關鍵字添加的公有屬性或公有方法。根據其特殊的名稱,其特殊的權利在于:與在prototype定義的公有成員不同,由于其是在構造函數中定義的,因此特權成員可以訪問私有成員。在此將不予舉例。
## 總結
根據靜態成員的定義方法可知,其與prototype是同級的屬性,可以被繼承的成員在prototype之下,據此可知,靜態成員只適用于對象的一個具體實例。
公有的prototype成員是對象藍圖的一部分,適用于通過new關鍵字實例化該對象的每一個實例。
私有和特權成員的相同之處在于,它們都在構造函數內部,會帶到構造函數的每一個實例中,會占用大量內存。
在合適的場合應用合適的成員,將使我們的程序更加優化。