javascript Prototype 對象擴展
更新時間:2009年05月15日 12:35:57 作者:
從對象創(chuàng)建一個實例說起來貌似是很簡單的東西,是啊,基本在所有的語言中,都是用new關(guān)鍵字來創(chuàng)建實例的
Javascript當(dāng)然也不例外,可是關(guān)于對象的引用問題,你考慮過么?通常的做法是一系列對象共享類的方法,而不是為每個對象復(fù)制一份函數(shù)。下面看看為每個對象復(fù)制一份函數(shù)的做法。
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());
看起來不錯,用起來也不錯,對象之間互相沒有任何干擾,也能正常完成工作,一切看起來理所當(dāng)然,但是你每次產(chǎn)生一個新對象的時候,腳本引擎都會給對象復(fù)制一份屬性和方法,有沒有覺得這樣很浪費內(nèi)存呢?在客戶端的這種對象的復(fù)制方式,極其容易造成內(nèi)存泄露,因為每次產(chǎn)生新的實例都會復(fù)制所有的屬性和方法,占用大量的內(nèi)存。
在大型JavaScript應(yīng)用中首先考慮的就是內(nèi)存問題。
正確的使用方法是用prototype關(guān)鍵字來定義一個類的方法或者屬性
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);
這樣的話,你創(chuàng)建的對象之間可以共用方法,也就是showmsg()函數(shù)只定義一次,其它的對象共用這一個方法,而不是復(fù)制出自己的方法。
Javascript中的prototype已經(jīng)說完。
看看JavaScript中的對象擴展
function rand(x)
{
return Math.ceil(Math.random()*x);
}
生成隨機數(shù)組的一個擴展方法
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]);
}
再看看對象反射
反射是一種對象的機制,它允許你在完全不了解對象的情況下了解它的屬性和方法,通常情況下,程序員對于自己所操縱的對象是如何組成的是非常了解的,但是在某些特殊情況下使用某個其他人寫的復(fù)雜的對象的時候,我們需要快速了解這個對象的屬性和方法,就需要用到反射的機制,當(dāng)然反射的應(yīng)用并不是局限于此,這里只是介紹反射在Javascript中的使用方法.
首先我們可能想知道在某個對象中是否存在一個特定的屬性或者方法,這時候我們可以地測試它:
if(typeof(myobject.someproperty)!="undefined")
{
}
在Javascript中如果沒有定義一個對象或者變量的話,它總是返回undefined類型.
也可以用其他的內(nèi)建類來縮小測試范圍:
if(myobject instanceof Object)
{
}
instanceof 是用來測試內(nèi)建類或者自定義類的操作符,內(nèi)建類指Array,String,Date,Number,Math,RegExp,Boolean,Function之類的內(nèi)建類.例如:Function和Array都是繼承自O(shè)bject類的,所以如果你在代碼中如果測試某個Array對象的話,如果你先測試它是否是Object,將返回true,如果測試它是否是Array的話,它也會返回true。
一個更簡單而有用的方法,是遍歷一個對象的所有屬性和方法來快速了解一個對象的內(nèi)部狀態(tài):
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]);
}
復(fù)制代碼 代碼如下:
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());
看起來不錯,用起來也不錯,對象之間互相沒有任何干擾,也能正常完成工作,一切看起來理所當(dāng)然,但是你每次產(chǎn)生一個新對象的時候,腳本引擎都會給對象復(fù)制一份屬性和方法,有沒有覺得這樣很浪費內(nèi)存呢?在客戶端的這種對象的復(fù)制方式,極其容易造成內(nèi)存泄露,因為每次產(chǎn)生新的實例都會復(fù)制所有的屬性和方法,占用大量的內(nèi)存。
在大型JavaScript應(yīng)用中首先考慮的就是內(nèi)存問題。
正確的使用方法是用prototype關(guān)鍵字來定義一個類的方法或者屬性
復(fù)制代碼 代碼如下:
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);
這樣的話,你創(chuàng)建的對象之間可以共用方法,也就是showmsg()函數(shù)只定義一次,其它的對象共用這一個方法,而不是復(fù)制出自己的方法。
Javascript中的prototype已經(jīng)說完。
看看JavaScript中的對象擴展
復(fù)制代碼 代碼如下:
function rand(x)
{
return Math.ceil(Math.random()*x);
}
生成隨機數(shù)組的一個擴展方法
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]);
}
再看看對象反射
反射是一種對象的機制,它允許你在完全不了解對象的情況下了解它的屬性和方法,通常情況下,程序員對于自己所操縱的對象是如何組成的是非常了解的,但是在某些特殊情況下使用某個其他人寫的復(fù)雜的對象的時候,我們需要快速了解這個對象的屬性和方法,就需要用到反射的機制,當(dāng)然反射的應(yīng)用并不是局限于此,這里只是介紹反射在Javascript中的使用方法.
首先我們可能想知道在某個對象中是否存在一個特定的屬性或者方法,這時候我們可以地測試它:
if(typeof(myobject.someproperty)!="undefined")
{
}
在Javascript中如果沒有定義一個對象或者變量的話,它總是返回undefined類型.
也可以用其他的內(nèi)建類來縮小測試范圍:
if(myobject instanceof Object)
{
}
instanceof 是用來測試內(nèi)建類或者自定義類的操作符,內(nèi)建類指Array,String,Date,Number,Math,RegExp,Boolean,Function之類的內(nèi)建類.例如:Function和Array都是繼承自O(shè)bject類的,所以如果你在代碼中如果測試某個Array對象的話,如果你先測試它是否是Object,將返回true,如果測試它是否是Array的話,它也會返回true。
一個更簡單而有用的方法,是遍歷一個對象的所有屬性和方法來快速了解一個對象的內(nèi)部狀態(tài):
復(fù)制代碼 代碼如下:
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]);
}
您可能感興趣的文章:
- JavaScript為對象原型prototype添加屬性的兩種方式
- js使用原型對象(prototype)需要注意的地方
- [js高手之路]圖解javascript的原型(prototype)對象,原型鏈實例
- javascript當(dāng)中的代碼嗅探擴展原生對象和原型(prototype)
- JS 面向?qū)ο笾衿娴膒rototype
- JS面向?qū)ο蟆rototype、call()、apply()
- JavaScript面向?qū)ο笾甈rototypes和繼承
- JavaScript prototype對象的屬性說明
- JavaScript中prototype為對象添加屬性的誤區(qū)介紹
- javascript 對象 與 prototype 原型用法實例分析
相關(guān)文章
uniapp中canvas繪制圖片內(nèi)容空白報錯的原因及解決
最近有個需求就是要用canvas畫個分享的海報,所以這里總結(jié)下,這篇文章主要給大家介紹了關(guān)于uniapp中canvas繪制圖片內(nèi)容空白報錯的原因及解決方法,需要的朋友可以參考下2023-09-09js實現(xiàn)window.open不被攔截的解決方法匯總
這篇文章主要介紹了js實現(xiàn)window.open不被攔截的解決方法,實例匯總了常用的不被攔截的解決方法,需要的朋友可以參考下2014-10-10js和html5實現(xiàn)手機端刮刮卡抽獎效果完美兼容android/IOS
手機完美支持html5,所以如果手機端想要做個抽獎模塊的話,用刮刮卡抽獎效果,相信這個互動體驗是非常棒的,本人親自完成,有錯誤請大家指出2013-11-11