javascript Prototype 對象擴充

來源:互聯網
上載者:User

Javascript當然也不例外,可是關於對象的引用問題,你考慮過嗎?通常的做法是一系列對象共用類的方法,而不是為每個對象複製一份函數。下面看看為每個對象複製一份函數的做法。 複製代碼 代碼如下:var myobject=function(param1,param2)
{
this.name=param1;
this.age=param2;
this.showmsg=function()
{
alert("name:"+this.name+"\n"+"age:"+this.age);
}
}
var objectone=new myobject('liu',20);
alert(objectone.name); //liu
var objecttwo=new myobject('lin',20);
alert(objecttwo.name); //lin
alert(objecttwo.showmsg());
var objectthree=new myobject('lhking',22);
alert(objectthree.showmsg());

看起來不錯,用起來也不錯,對象之間互相沒有任何幹擾,也能正常完成工作,一切看起來理所當然,但是你每次產生一個新對象的時候,指令碼引擎都會給對象複製一份屬性和方法,有沒有覺得這樣很浪費記憶體呢?在用戶端的這種對象的複製方式,極其容易造成記憶體泄露,因為每次產生新的執行個體都會複製所有的屬性和方法,佔用大量的記憶體。
在大型JavaScript應用中首先考慮的就是記憶體問題。
正確的使用方法是用prototype關鍵字來定義一個類的方法或者屬性 複製代碼 代碼如下:var myobject=function(param1,param2)
{
this.name=param1;
this.age=param2;
myobject.prototype.showmsg=function()
{
alert("name:"+this.name+"\n"+"age:"+this.age);
}
}
var objectone=new myobject('liu',20);
alert(objectone.name);
var objecttwo=new myobject('lin',20);
alert(objecttwo.name);
alert(objecttwo.showmsg());
var objectthree=new myobject('lhking',22);
alert(objectthree.showmsg);

這樣的話,你建立的對象之間可以共用方法,也就是showmsg()函數只定義一次,其它的對象共用這一個方法,而不是複製出自己的方法。
Javascript中的prototype已經說完。

看看JavaScript中的對象擴充 複製代碼 代碼如下:function rand(x)
{
return Math.ceil(Math.random()*x);
}
產生隨機數組的一個擴充方法
Array.prototype.random=function()
{
for(var i=(this.length-1);i>1;i--)
{
var j=rand(this.length-1);
var cache=this[i];
this[i]=this[j];
this[j]=cache;
}
}
var array=new Array("1","2","3","4","5");
for(var a in array)
{
alert(array[a]);
}
array.random();
for(var b in array)
{
alert(array[b]);
}

再看看對象反射
反射是一種對象的機制,它允許你在完全不瞭解對象的情況下瞭解它的屬性和方法,通常情況下,程式員對於自己所操縱的對象是如何組成的是非常瞭解的,但是在某些特殊情況下使用某個其他人寫的複雜的對象的時候,我們需要快速瞭解這個對象的屬性和方法,就需要用到反射的機制,當然反射的應用並不是局限於此,這裡只是介紹反射在Javascript中的使用方法.

首先我們可能想知道在某個對象中是否存在一個特定的屬性或者方法,這時候我們可以地測試它:
if(typeof(myobject.someproperty)!="undefined")
{
}
在Javascript中如果沒有定義一個對象或者變數的話,它總是返回undefined類型.
也可以用其他的內建類來縮小測試範圍:
if(myobject instanceof Object)
{
}
instanceof 是用來測試內建類或者自訂類的操作符,內建類指Array,String,Date,Number,Math,RegExp,Boolean,Function之類的內建類.例如:Function和Array都是繼承自Object類的,所以如果你在代碼中如果測試某個Array對象的話,如果你先測試它是否是Object,將返回true,如果測試它是否是Array的話,它也會返回true。

一個更簡單而有用的方法,是遍曆一個對象的所有屬性和方法來快速瞭解一個對象的內部狀態: 複製代碼 代碼如下:function myobject(){
this.name="name";
this.age="age";
this.sex="sex";
this.func=function(){
}
}
var myobj=new myobject();
for(var i in myobj){
alert(myobj[i]);
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.