JS模擬面向?qū)ο笕猓ㄒ弧㈩愋图皞鬟f)
更新時間:2011年07月13日 00:08:24 作者:
首先說明JS的特點。JS是弱類型的語言,像什么模板多態(tài)、又是類又是結構的說法,就完全不存在。
可是,沒有類,何來面向?qū)ο笠徽f?沒有關系,可以模擬。而且這一套方法已經(jīng)成為公認的JS實現(xiàn)面向?qū)ο蟮姆椒ā?
另外,JS內(nèi)的東西完全開發(fā),也就不存在成員的什么private、protected作用域。
下面切入正題。
一、類型 //從基礎開始,省的后面看著吃力
1、類型的區(qū)別
基本數(shù)據(jù)類型和對象類型不是一回事。
a、基本類型只是一個值,沒有任何行為;而對象類型有自己的行為。
b、基本類型是值類型,僅表示一個值;對象類型則擁有許多復雜的東西。
c、基本類型傳遞時傳值,對象類型傳遞時傳址。
另外,文本非常特殊,JS里面有兩種文本類型——一種基本數(shù)據(jù)類型,一種對象類型。 舉個例子:
var str="The End";//這樣是基本數(shù)據(jù)類型,傳遞方式就是傳值
var str2=new string("The End");//這就不同,有了new這個為對象開辟內(nèi)存空間的標識符,對應的變量就會成為對象類型,傳遞時即傳址
簡單點說: a、直接用字面量賦值的變量,如var a=1;var b="a";var c=true;,都是基本數(shù)據(jù)類型(常用的有:數(shù)值、文本、布爾)
b、用new賦值的變量,如var a=new Object();var b=new string();,都是對象類型(JS有許多對象,算是精簡的面向?qū)ο笳Z言) 請注意:基本數(shù)據(jù)類型也可以new,但是很少有那種用法。因此上述區(qū)分辦法不完全適用所有情況,請加以自行判斷。
2、參數(shù)傳遞方式 這一節(jié)主要來區(qū)分傳址、傳值。 仍然拿例子來說事:
function changeVar(varible){
varible=5;
alert(varible);//提示5
}
var a=3;
alert(a);//提示3
changeVar(a);//該函數(shù)內(nèi)部有改變參數(shù)的代碼 alert(a);//仍然提示3
根據(jù)上例可以發(fā)現(xiàn),函數(shù)雖然改變了參數(shù),但是并沒有改變參數(shù)所代表的傳遞過去變量。這是傳值。在調(diào)用changeVar時,JS重新拷貝了一份你傳遞的變量作為參數(shù),所以,在changeVar內(nèi)部操作的參數(shù)實際上是你傳遞的變量的副本,而非本身。 傳遞的其實是變量的值,而非變量本身。這叫做傳值。
function changeVar(varible){
varible.x=5;
alert(varible.x);//提示5
}
var a=new Object;
a.x=3 alert(a.x);//提示3
changeVar(a);//該函數(shù)內(nèi)部有改變參數(shù)的代碼
alert(a.x);//提示5
上例改成使用Object對象了。發(fā)現(xiàn),changeVar之后,原來的變量的對應屬性也發(fā)生改變,函數(shù)內(nèi)部就是操作的傳遞的變量本身。 傳址就是這個道理,把你給定的變量的內(nèi)存地址傳遞過去,函數(shù)內(nèi)部改變的其實就是你傳遞的變量。因為操作的都是在統(tǒng)一內(nèi)存地址的東西。
但是,一定注意這個“但是”!JS的傳址還是有些特別之處! JS在傳遞對象類型時,大概也拷貝了一份相應類型的對象,但是副本對象的所有屬性、函數(shù)都是原對象的屬性、函數(shù)。 也許就是,屬性傳址而對象不傳址。 這個特點可以證明。 代碼如下:
function changeVar(varible){
varible=new Object();
varible.x=5;
alert(varible.x);//提示5
}
var a=new Object;
a.x=3 alert(a.x);//提示3
changeVar(a);//該函數(shù)內(nèi)部有改變參數(shù)的代碼
alert(a.x);//提示3
當你改變了參數(shù)代表的對象時,并未改變的了你傳遞的變量代表的對象。但前面說過,可以通過函數(shù)內(nèi)對參數(shù)對象的屬性操作改變原變量代表對象的屬性。這結合起來就可以證明,JS在傳遞對象類型時,也拷貝了一份相應類型的對象,但是副本對象的所有屬性、函數(shù)都是原對象的屬性、函數(shù)。
另外,JS內(nèi)的東西完全開發(fā),也就不存在成員的什么private、protected作用域。
下面切入正題。
一、類型 //從基礎開始,省的后面看著吃力
1、類型的區(qū)別
基本數(shù)據(jù)類型和對象類型不是一回事。
a、基本類型只是一個值,沒有任何行為;而對象類型有自己的行為。
b、基本類型是值類型,僅表示一個值;對象類型則擁有許多復雜的東西。
c、基本類型傳遞時傳值,對象類型傳遞時傳址。
另外,文本非常特殊,JS里面有兩種文本類型——一種基本數(shù)據(jù)類型,一種對象類型。 舉個例子:
var str="The End";//這樣是基本數(shù)據(jù)類型,傳遞方式就是傳值
var str2=new string("The End");//這就不同,有了new這個為對象開辟內(nèi)存空間的標識符,對應的變量就會成為對象類型,傳遞時即傳址
簡單點說: a、直接用字面量賦值的變量,如var a=1;var b="a";var c=true;,都是基本數(shù)據(jù)類型(常用的有:數(shù)值、文本、布爾)
b、用new賦值的變量,如var a=new Object();var b=new string();,都是對象類型(JS有許多對象,算是精簡的面向?qū)ο笳Z言) 請注意:基本數(shù)據(jù)類型也可以new,但是很少有那種用法。因此上述區(qū)分辦法不完全適用所有情況,請加以自行判斷。
2、參數(shù)傳遞方式 這一節(jié)主要來區(qū)分傳址、傳值。 仍然拿例子來說事:
復制代碼 代碼如下:
function changeVar(varible){
varible=5;
alert(varible);//提示5
}
var a=3;
alert(a);//提示3
changeVar(a);//該函數(shù)內(nèi)部有改變參數(shù)的代碼 alert(a);//仍然提示3
根據(jù)上例可以發(fā)現(xiàn),函數(shù)雖然改變了參數(shù),但是并沒有改變參數(shù)所代表的傳遞過去變量。這是傳值。在調(diào)用changeVar時,JS重新拷貝了一份你傳遞的變量作為參數(shù),所以,在changeVar內(nèi)部操作的參數(shù)實際上是你傳遞的變量的副本,而非本身。 傳遞的其實是變量的值,而非變量本身。這叫做傳值。
復制代碼 代碼如下:
function changeVar(varible){
varible.x=5;
alert(varible.x);//提示5
}
var a=new Object;
a.x=3 alert(a.x);//提示3
changeVar(a);//該函數(shù)內(nèi)部有改變參數(shù)的代碼
alert(a.x);//提示5
上例改成使用Object對象了。發(fā)現(xiàn),changeVar之后,原來的變量的對應屬性也發(fā)生改變,函數(shù)內(nèi)部就是操作的傳遞的變量本身。 傳址就是這個道理,把你給定的變量的內(nèi)存地址傳遞過去,函數(shù)內(nèi)部改變的其實就是你傳遞的變量。因為操作的都是在統(tǒng)一內(nèi)存地址的東西。
但是,一定注意這個“但是”!JS的傳址還是有些特別之處! JS在傳遞對象類型時,大概也拷貝了一份相應類型的對象,但是副本對象的所有屬性、函數(shù)都是原對象的屬性、函數(shù)。 也許就是,屬性傳址而對象不傳址。 這個特點可以證明。 代碼如下:
復制代碼 代碼如下:
function changeVar(varible){
varible=new Object();
varible.x=5;
alert(varible.x);//提示5
}
var a=new Object;
a.x=3 alert(a.x);//提示3
changeVar(a);//該函數(shù)內(nèi)部有改變參數(shù)的代碼
alert(a.x);//提示3
當你改變了參數(shù)代表的對象時,并未改變的了你傳遞的變量代表的對象。但前面說過,可以通過函數(shù)內(nèi)對參數(shù)對象的屬性操作改變原變量代表對象的屬性。這結合起來就可以證明,JS在傳遞對象類型時,也拷貝了一份相應類型的對象,但是副本對象的所有屬性、函數(shù)都是原對象的屬性、函數(shù)。
相關文章
頁面js遇到亂碼問題的解決方法是和無法轉(zhuǎn)碼的情況
在老項目里加些js文件和老項目的編碼格式不一致出現(xiàn)亂碼,由于兩個文件都不能轉(zhuǎn)格式,于是百度個不錯的方法在此與大家分享下2014-04-04JavaScript判斷是否為數(shù)組的3種方法及效率比較
這篇文章主要介紹了JavaScript判斷是否為數(shù)組的3種方法及效率比較,本文直接給出運行效果和實現(xiàn)代碼,需要的朋友可以參考下2015-04-04