|
初級(jí)開發(fā)者可能會(huì)這樣定義對(duì)象:
var obj = new Object();
obj.name = "hero";
obj.showName=function (){alert(this.name);}
這里存在一個(gè)問(wèn)題就是如果我們要在多個(gè)地方用obj對(duì)象,可能在程序中類似的代碼要寫好多遍,于是產(chǎn)生了工廠方法
function createObj()
{
var obj = new Object();
obj.name="hero";
obj.showName=function (){alert(this.name);}
return obj;
}
var obj1 = createObj();
var obj2 = createObj();
和另外一種方法 構(gòu)造函數(shù)法
function obj (name)
{
this.name=name;
this.showName= function (){alert(this.name);}
}
把生成對(duì)象的代碼封裝起來(lái),避免出現(xiàn)重復(fù)new的代碼,當(dāng)然也可以進(jìn)一步改進(jìn),就是createObj傳遞一些參數(shù),而不是給obj賦默認(rèn)固定值:
function createObj(name)
{
var obj = new Object();
obj.name=name;
obj.showName=function (){alert(this.name);}
return obj;
}
var obj1 = createObj("hero");
var o'b'j2=createObj("dby");
但是存在一個(gè)問(wèn)題,就是我們每次調(diào)用createObj函數(shù)都會(huì)創(chuàng)建新的函數(shù) showName.意味著每個(gè)對(duì)象都有自己版本的showName,所以要改進(jìn)避開這個(gè)問(wèn)題.
function showName()
{
alert(this.name)
}
function createObj(name)
{
var obj = new Object();
obj.name=name;
obj.showName=showName;
return obj;
}
這樣就解決了 重復(fù)創(chuàng)建函數(shù)的問(wèn)題, 哈哈哈,大功告成 .
原型方式:
主要是利用對(duì)象的prototype屬性.
function obj()
{}
obj.prototype.name="hero";
obj.prototype.showName=function()
{
alert(this.name);
}
看起來(lái)似乎比剛才的工廠還完美,但是 有一個(gè)問(wèn)題,該函數(shù)沒(méi)有構(gòu)造函數(shù),屬性是通過(guò)prototype指定的,這一點(diǎn)在實(shí)際應(yīng)用中很讓人頭疼,所有的實(shí)例的屬性都一樣實(shí)在是不能讓人接受.尤其還存在一個(gè)安全隱患,那就是當(dāng)對(duì)象中有引用時(shí),例如 加上這樣一段
obj.prototype.nameArray = new Array("hero","dby");
然后
obj1 = new obj();
obj2 = new obj();
obj1.nameArray.push("lxw");
在obj2的nameArray中將也會(huì)看到這個(gè)屬性,因?yàn)閮蓚€(gè)對(duì)象的nameArray指向的是同一個(gè)引用.
所以這種方式并不是理想方法.
需要 改進(jìn)
結(jié)合構(gòu)造函數(shù),在構(gòu)造函數(shù)定義屬性,用原型定義方法
例如
fuction obj(name)
{
this.name = name
this.nameArray = new Array("hero","dby");
}
obj.prototype.showName = function(){alert(this.name)}
所有的非函數(shù)屬性都在構(gòu)造函數(shù)里創(chuàng)建,函數(shù)屬性用prototype方式創(chuàng)建,obj1 中改變nameArray的值,不會(huì)影響到obj2對(duì)象的nameArray的值, 而且只有一個(gè)showName函數(shù),所以沒(méi)有內(nèi)存浪費(fèi).
基本上完美了,剩下的基本都是一下其他的修飾了.有興趣的可以自己改著玩玩.
筆者在這里加上一個(gè)單例 玩了一下:
function obj (name)
{
this.name = name;
this.nameArray=new Array("hero","dby");
if(typeof obj._initialized=='undefined')
{
obj.prototype.showName=function(){alert(this.name);}
obj._initialized="true";
}
}
其實(shí)不算是單例, 只不過(guò)是在構(gòu)造對(duì)象的時(shí)候,先判斷一個(gè)屬性是否被定義,如果沒(méi)有定義,那么用原型方法繼續(xù)定義對(duì)象,如果已經(jīng)定義了屬性,那么就不在重復(fù)定義函數(shù)了. 該prototype方法只被創(chuàng)建一次,病賦值一次.
又差不多完美了,大功告成 .
這是個(gè)人的理解,,希望對(duì)大家有幫助,不完善的地方請(qǐng)qq聯(lián)系,及時(shí)改正。
這是一個(gè)完整的實(shí)例:
function Rectangle(name,color,width,heigth){
this.name=name;
this.color=color;
this.width=width;
this.heigth=heigth;
}
Rectangle.prototype.area=function(){
return this.width*this.heigth
}
Rectangle.prototype.show=function(){
document.write(this.name+" "+this.color+" "+this.width+" "+this.heigth+"<br/>");
document.write(this.area());
}
var obj1= new Rectangle("Rectangle","red",15,20);
obj1.show();
JavaScript技術(shù):javascript 對(duì)象定義方法 簡(jiǎn)單易學(xué),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。