JS模擬面向?qū)ο笕猓ㄒ?、?lèi)型及傳遞)
更新時(shí)間:2011年07月13日 00:08:24 作者:
首先說(shuō)明JS的特點(diǎn)。JS是弱類(lèi)型的語(yǔ)言,像什么模板多態(tài)、又是類(lèi)又是結(jié)構(gòu)的說(shuō)法,就完全不存在。
可是,沒(méi)有類(lèi),何來(lái)面向?qū)ο笠徽f(shuō)?沒(méi)有關(guān)系,可以模擬。而且這一套方法已經(jīng)成為公認(rèn)的JS實(shí)現(xiàn)面向?qū)ο蟮姆椒ā?
另外,JS內(nèi)的東西完全開(kāi)發(fā),也就不存在成員的什么private、protected作用域。
下面切入正題。
一、類(lèi)型 //從基礎(chǔ)開(kāi)始,省的后面看著吃力
1、類(lèi)型的區(qū)別
基本數(shù)據(jù)類(lèi)型和對(duì)象類(lèi)型不是一回事。
a、基本類(lèi)型只是一個(gè)值,沒(méi)有任何行為;而對(duì)象類(lèi)型有自己的行為。
b、基本類(lèi)型是值類(lèi)型,僅表示一個(gè)值;對(duì)象類(lèi)型則擁有許多復(fù)雜的東西。
c、基本類(lèi)型傳遞時(shí)傳值,對(duì)象類(lèi)型傳遞時(shí)傳址。
另外,文本非常特殊,JS里面有兩種文本類(lèi)型——一種基本數(shù)據(jù)類(lèi)型,一種對(duì)象類(lèi)型。 舉個(gè)例子:
var str="The End";//這樣是基本數(shù)據(jù)類(lèi)型,傳遞方式就是傳值
var str2=new string("The End");//這就不同,有了new這個(gè)為對(duì)象開(kāi)辟內(nèi)存空間的標(biāo)識(shí)符,對(duì)應(yīng)的變量就會(huì)成為對(duì)象類(lèi)型,傳遞時(shí)即傳址
簡(jiǎn)單點(diǎn)說(shuō): a、直接用字面量賦值的變量,如var a=1;var b="a";var c=true;,都是基本數(shù)據(jù)類(lèi)型(常用的有:數(shù)值、文本、布爾)
b、用new賦值的變量,如var a=new Object();var b=new string();,都是對(duì)象類(lèi)型(JS有許多對(duì)象,算是精簡(jiǎn)的面向?qū)ο笳Z(yǔ)言) 請(qǐng)注意:基本數(shù)據(jù)類(lèi)型也可以new,但是很少有那種用法。因此上述區(qū)分辦法不完全適用所有情況,請(qǐng)加以自行判斷。
2、參數(shù)傳遞方式 這一節(jié)主要來(lái)區(qū)分傳址、傳值。 仍然拿例子來(lái)說(shuō)事:
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ù),但是并沒(méi)有改變參數(shù)所代表的傳遞過(guò)去變量。這是傳值。在調(diào)用changeVar時(shí),JS重新拷貝了一份你傳遞的變量作為參數(shù),所以,在changeVar內(nèi)部操作的參數(shù)實(shí)際上是你傳遞的變量的副本,而非本身。 傳遞的其實(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對(duì)象了。發(fā)現(xiàn),changeVar之后,原來(lái)的變量的對(duì)應(yīng)屬性也發(fā)生改變,函數(shù)內(nèi)部就是操作的傳遞的變量本身。 傳址就是這個(gè)道理,把你給定的變量的內(nèi)存地址傳遞過(guò)去,函數(shù)內(nèi)部改變的其實(shí)就是你傳遞的變量。因?yàn)椴僮鞯亩际窃诮y(tǒng)一內(nèi)存地址的東西。
但是,一定注意這個(gè)“但是”!JS的傳址還是有些特別之處! JS在傳遞對(duì)象類(lèi)型時(shí),大概也拷貝了一份相應(yīng)類(lèi)型的對(duì)象,但是副本對(duì)象的所有屬性、函數(shù)都是原對(duì)象的屬性、函數(shù)。 也許就是,屬性傳址而對(duì)象不傳址。 這個(gè)特點(diǎn)可以證明。 代碼如下:
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
當(dāng)你改變了參數(shù)代表的對(duì)象時(shí),并未改變的了你傳遞的變量代表的對(duì)象。但前面說(shuō)過(guò),可以通過(guò)函數(shù)內(nèi)對(duì)參數(shù)對(duì)象的屬性操作改變?cè)兞看韺?duì)象的屬性。這結(jié)合起來(lái)就可以證明,JS在傳遞對(duì)象類(lèi)型時(shí),也拷貝了一份相應(yīng)類(lèi)型的對(duì)象,但是副本對(duì)象的所有屬性、函數(shù)都是原對(duì)象的屬性、函數(shù)。
另外,JS內(nèi)的東西完全開(kāi)發(fā),也就不存在成員的什么private、protected作用域。
下面切入正題。
一、類(lèi)型 //從基礎(chǔ)開(kāi)始,省的后面看著吃力
1、類(lèi)型的區(qū)別
基本數(shù)據(jù)類(lèi)型和對(duì)象類(lèi)型不是一回事。
a、基本類(lèi)型只是一個(gè)值,沒(méi)有任何行為;而對(duì)象類(lèi)型有自己的行為。
b、基本類(lèi)型是值類(lèi)型,僅表示一個(gè)值;對(duì)象類(lèi)型則擁有許多復(fù)雜的東西。
c、基本類(lèi)型傳遞時(shí)傳值,對(duì)象類(lèi)型傳遞時(shí)傳址。
另外,文本非常特殊,JS里面有兩種文本類(lèi)型——一種基本數(shù)據(jù)類(lèi)型,一種對(duì)象類(lèi)型。 舉個(gè)例子:
var str="The End";//這樣是基本數(shù)據(jù)類(lèi)型,傳遞方式就是傳值
var str2=new string("The End");//這就不同,有了new這個(gè)為對(duì)象開(kāi)辟內(nèi)存空間的標(biāo)識(shí)符,對(duì)應(yīng)的變量就會(huì)成為對(duì)象類(lèi)型,傳遞時(shí)即傳址
簡(jiǎn)單點(diǎn)說(shuō): a、直接用字面量賦值的變量,如var a=1;var b="a";var c=true;,都是基本數(shù)據(jù)類(lèi)型(常用的有:數(shù)值、文本、布爾)
b、用new賦值的變量,如var a=new Object();var b=new string();,都是對(duì)象類(lèi)型(JS有許多對(duì)象,算是精簡(jiǎn)的面向?qū)ο笳Z(yǔ)言) 請(qǐng)注意:基本數(shù)據(jù)類(lèi)型也可以new,但是很少有那種用法。因此上述區(qū)分辦法不完全適用所有情況,請(qǐng)加以自行判斷。
2、參數(shù)傳遞方式 這一節(jié)主要來(lái)區(qū)分傳址、傳值。 仍然拿例子來(lái)說(shuō)事:
復(fù)制代碼 代碼如下:
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ù),但是并沒(méi)有改變參數(shù)所代表的傳遞過(guò)去變量。這是傳值。在調(diào)用changeVar時(shí),JS重新拷貝了一份你傳遞的變量作為參數(shù),所以,在changeVar內(nèi)部操作的參數(shù)實(shí)際上是你傳遞的變量的副本,而非本身。 傳遞的其實(shí)是變量的值,而非變量本身。這叫做傳值。
復(fù)制代碼 代碼如下:
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對(duì)象了。發(fā)現(xiàn),changeVar之后,原來(lái)的變量的對(duì)應(yīng)屬性也發(fā)生改變,函數(shù)內(nèi)部就是操作的傳遞的變量本身。 傳址就是這個(gè)道理,把你給定的變量的內(nèi)存地址傳遞過(guò)去,函數(shù)內(nèi)部改變的其實(shí)就是你傳遞的變量。因?yàn)椴僮鞯亩际窃诮y(tǒng)一內(nèi)存地址的東西。
但是,一定注意這個(gè)“但是”!JS的傳址還是有些特別之處! JS在傳遞對(duì)象類(lèi)型時(shí),大概也拷貝了一份相應(yīng)類(lèi)型的對(duì)象,但是副本對(duì)象的所有屬性、函數(shù)都是原對(duì)象的屬性、函數(shù)。 也許就是,屬性傳址而對(duì)象不傳址。 這個(gè)特點(diǎn)可以證明。 代碼如下:
復(fù)制代碼 代碼如下:
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
當(dāng)你改變了參數(shù)代表的對(duì)象時(shí),并未改變的了你傳遞的變量代表的對(duì)象。但前面說(shuō)過(guò),可以通過(guò)函數(shù)內(nèi)對(duì)參數(shù)對(duì)象的屬性操作改變?cè)兞看韺?duì)象的屬性。這結(jié)合起來(lái)就可以證明,JS在傳遞對(duì)象類(lèi)型時(shí),也拷貝了一份相應(yīng)類(lèi)型的對(duì)象,但是副本對(duì)象的所有屬性、函數(shù)都是原對(duì)象的屬性、函數(shù)。
您可能感興趣的文章:
- JavaScript使用prototype定義對(duì)象類(lèi)型
- javascript中獲取選中對(duì)象的類(lèi)型
- js判斷對(duì)象是否是某一類(lèi)型
- isArray()函數(shù)(JavaScript中對(duì)象類(lèi)型判斷的幾種方法)
- JavaScript 對(duì)象的屬性和方法4種不同的類(lèi)型
- JS模擬面向?qū)ο笕猓ǘ?、?lèi)型與賦值)
- js確定對(duì)象類(lèi)型方法
- js中判斷Object、Array、Function等引用類(lèi)型對(duì)象是否相等
- JavaScript中判斷對(duì)象類(lèi)型的幾種方法總結(jié)
- 詳解JavaScript對(duì)象類(lèi)型
相關(guān)文章
頁(yè)面js遇到亂碼問(wèn)題的解決方法是和無(wú)法轉(zhuǎn)碼的情況
在老項(xiàng)目里加些js文件和老項(xiàng)目的編碼格式不一致出現(xiàn)亂碼,由于兩個(gè)文件都不能轉(zhuǎn)格式,于是百度個(gè)不錯(cuò)的方法在此與大家分享下2014-04-04JavaScript判斷是否為數(shù)組的3種方法及效率比較
這篇文章主要介紹了JavaScript判斷是否為數(shù)組的3種方法及效率比較,本文直接給出運(yùn)行效果和實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04js中文逗號(hào)轉(zhuǎn)英文實(shí)現(xiàn)
中文逗號(hào)如何轉(zhuǎn)英文,下面為大家詳細(xì)介紹下,感興趣的朋友不要錯(cuò)過(guò)2014-02-02實(shí)現(xiàn)變速回到頂部的JavaScript代碼
一般網(wǎng)頁(yè)的下方都會(huì)放置一個(gè)置頂按鈕, 尤其是頁(yè)面底部沒(méi)有導(dǎo)航的網(wǎng)頁(yè), 這樣可以幫助訪客重新找到導(dǎo)航或者重溫一遍廣告 (想得真美).2011-05-05webpack與SPA實(shí)踐之管理CSS等資源的方法
本篇文章主要介紹了webpack與SPA實(shí)踐之管理CSS等資源的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12JS獲取字符串實(shí)際長(zhǎng)度(包含漢字)的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇JS獲取字符串實(shí)際長(zhǎng)度(包含漢字)的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08