javascript中對象創建方式

今天學習了js中的對象,現在還是初學,寫的不好,只是自己做做筆記,以後要用方便翻閱。下面是對js中對象創建的一些總結:

1.基本模式

(1)用new操作符後面跟Object構造函數,如下所示:

<span style="font-family:Microsoft YaHei;font-size:14px;">var phone=new Object();
phone.name='手機';
phone.size=5.5;</span>
(2)對象字面量表示法,是對含有大量屬性的對象的一種簡寫方式,如下:
<span style="font-size:14px;">var phone={
//	屬性/值中間用分號隔開,每一對之間用逗號隔開
	name:'手機',
	size:'5.5',
}</span>
注意:屬性名可以添加引號,屬性名中有空格、- 等連接必須加引號
缺陷:(1)創建多個對象時比較繁瑣,效率低,比較適合創建單個臨時的對象;(2)實例與原型之間看不出什麼聯繫;

2.工廠模式

其實就是把基本模式中創建對象的過程封裝到一個函數中,如下所示:

<span style="font-family:Microsoft YaHei;font-size:14px;">function createPhone(name,size){
	var phone=new Object();
	phone.name=name;
	phone.size=size;
	phone.run=function (){
		alert('具有打電話的功能');
	}
	return phone;
}
var phone1=createPhone('手機',5.5);</span>
問題:(1)實例之間沒有內在聯繫,不能反映出它們是同一個原型對象的實例;(2)沒有使用new關鍵字創建函數;(3)浪費資源,生成一個實例就開闢一個內存。

3.構造函數模式

構造函數跟創建函數類似,它將屬性和方法賦給了this對象,沒有return語句,如下所示:
<span style="font-family:Microsoft YaHei;font-size:14px;">function Phone(name,size){
//	按照慣例,構造函數名第一個字母要大寫
	this.name=name;
	this.size=size;
	this.run=function (){
		alert('具有打電話的功能');
	}
}
var phone1=new Phone('手機',5.5);
//	用new關鍵字生成實例,不用new關鍵字調用就跟普通函數沒有區別</span>
問題:每實例化一次都要把裏面的內容重新加載一次,佔用內存,缺乏效率

4.原型模式

用prototype(原型)屬性創建實例的原型對象,實例可以共享它包含的屬性和方法,如下所示:

<pre name="code" class="javascript"><span style="font-family:Microsoft YaHei;font-size:14px;">function Phone(){}
	Phone.prototype.name='手機';
	Phone.prototype.size=5.5;
	Phone.prototype.run=function (){
		alert('具有打電話的功能');
	}
var phone1=new Phone();</span>


問題:不能傳遞函數初始化屬性的值,不能共享對象

4.組合模式

就是構造函數模式跟原型模式的組合,用構造函數定義非函數屬性,原型方式定義方法,這種方法最爲常見,如下:

<span style="font-family:Microsoft YaHei;font-size:14px;">function Phone(name,size){
	Phone.name=name;
	Phone.size=size;
}
Phone.prototype.run=function (){
	alert('具有打電話的功能');
}
var phone1=new Phone('手機',5.5);</span>
問題:解決了每次實例化的都要初始化,不能傳參的問題,不夠也不是完美,沒有體現良好的封裝性

4.動態原型模式

爲解決組合模式的封裝性,把原型定義的方法放到構造函數中,如下所示:

<span style="font-family:Microsoft YaHei;">function Phone(name,size){
	Phone.name=name;
	Phone.size=size;
//	方法初始化一次即可,用if語句判斷,如果方法undefined,執行一次
	if(typeof this.run=='undefined'){
		Phone.prototype.run=function (){
			alert('具有打電話的功能');
		}
	}
}
var phone1=new Phone('手機',5.5);</span>


原型模式如果屬性和方法比較多,都可以用字面量表示法表示。



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