JS模擬面向?qū)ο笕猓ǘ?、類型與賦值)
更新時(shí)間:2011年07月13日 00:10:38 作者:
上次,我講了有關(guān)類型區(qū)別和傳遞的問題,現(xiàn)在,我給大家在插上一點(diǎn)有關(guān)類型賦值的問題。
類型賦值類似變量傳遞的問題。
基本數(shù)據(jù)類型不必說,傳值的。
var a=5;
var b=a;
b=3;
alert(a);//提示5
alert(b);//提示3
由此觀之,發(fā)現(xiàn)改變b不會(huì)改變a,因?yàn)槎际亲兞康闹翟趤砘貍鬟f,和變量本身沒有關(guān)系。
對象類型,傳址的。
var a=new Object();
a.x=5;
var b=a;
b.x=3;
alert(a.x);//提示3
alert(b.x);//提示3
這樣,由于傳址,所以b即是a,a即是b,互相改變。
如若還不清楚,再舉個(gè)例子:
var a=new Object();
a.x=5;
var b=a;
alert(b.x);//提示5,b.x即a.x,都是5
a.x=3;//改a.x即改b.x,都是3了
alert(a.x);//提示3
alert(b.x);//提示3
不過,對象類型的屬性互相賦值,就與對象類型沒關(guān)系了,就和其屬性的類型有關(guān)系。
屬性是基本數(shù)據(jù)類型則傳值,屬性是對象類型則傳址。舉個(gè)例子吧,簡單點(diǎn):
var a=new Object();
a.x=5; var b=new Object();
b.x=a.x; b.x=3;
alert(a.x);//提示5
alert(b.x);//提示3
上面來回賦值的不過是兩個(gè)不同對象的屬性,都是互相孤立的,也都是基本數(shù)據(jù)類型,因此只是互相傳值,不會(huì)互相影響。
var a=new Object();
a.x=5;
var b=a.x;
b=3;
alert(a.x);/提示/5
alert(b);//提示3
這也是一樣,b這個(gè)基本數(shù)據(jù)類型與a的基本數(shù)據(jù)類型的屬性x相互賦值,同樣不會(huì)互相影響,只是互相傳值。
可是,對象的屬性如果也是對象類型,那就也是傳址了。
var a=new Object();
a.x=new Object;
a.x.n=5;
var b=a.x;
alert(b.n);//提示5
b.n=3;//也就改了a.x的n
alert(a.x.n);//提示3
alert(b.n);//提示3
a對象的屬性x,被定義為一個(gè)Object對象類型。因此b賦值為a.x時(shí),他們就是互通的了,其實(shí)就是同一個(gè)了,可以互相影響、改變。
————
可是,如果我想讓對象類型變量賦值時(shí),只是拷貝屬性,而不是達(dá)到“你就是我,我就是你”的境界、“同生共死”的高尚品格。怎么辦?
木有什么特別好的辦法,用下面這個(gè)函數(shù)吧。
var DeepCopy = function(destination, source)
{
for (var property in source)
{
var copy = source[property];
if ( destination === copy ) continue;
if ( typeof copy === "object" )
{
destination[property] = DeepCopy(destination[property] || {}, copy);
}
else
{
destination[property] = copy;
}
}
return destination;
}
用法
var a=new Object;
a.x=5;
a.y=3;
var b=new Object;
DeepCopy(b,a);
alert(b.x);//提示5
alert(b.y);//提示3
b.x=8;
alert(a.x);//提示5
看,修改了b.x卻不能影響a.x了吧?
這個(gè)DeepCopy是個(gè)不錯(cuò)的函數(shù)。
上面實(shí)現(xiàn)了對象類型的模擬“傳值”
那么怎么做才能模擬基本數(shù)據(jù)類型的“傳址”?
就是用Array對象。
function change(a)
{
a[0]=5;
alert(a);//提示5
}
var x=[3];
alert(x);//提示3
change(x);
alert(x);//提示5
賦值為一個(gè)[xx],其實(shí)就是賦值為一個(gè)有數(shù)據(jù)的Array對象。這里就是利用含有一個(gè)元素的數(shù)組來模擬傳址。因?yàn)閿?shù)組是對象類型,傳遞時(shí)傳址。
當(dāng)然,你也可以用任意對象類型的屬性來模擬。
基本數(shù)據(jù)類型不必說,傳值的。
復(fù)制代碼 代碼如下:
var a=5;
var b=a;
b=3;
alert(a);//提示5
alert(b);//提示3
由此觀之,發(fā)現(xiàn)改變b不會(huì)改變a,因?yàn)槎际亲兞康闹翟趤砘貍鬟f,和變量本身沒有關(guān)系。
對象類型,傳址的。
復(fù)制代碼 代碼如下:
var a=new Object();
a.x=5;
var b=a;
b.x=3;
alert(a.x);//提示3
alert(b.x);//提示3
這樣,由于傳址,所以b即是a,a即是b,互相改變。
如若還不清楚,再舉個(gè)例子:
復(fù)制代碼 代碼如下:
var a=new Object();
a.x=5;
var b=a;
alert(b.x);//提示5,b.x即a.x,都是5
a.x=3;//改a.x即改b.x,都是3了
alert(a.x);//提示3
alert(b.x);//提示3
不過,對象類型的屬性互相賦值,就與對象類型沒關(guān)系了,就和其屬性的類型有關(guān)系。
屬性是基本數(shù)據(jù)類型則傳值,屬性是對象類型則傳址。舉個(gè)例子吧,簡單點(diǎn):
復(fù)制代碼 代碼如下:
var a=new Object();
a.x=5; var b=new Object();
b.x=a.x; b.x=3;
alert(a.x);//提示5
alert(b.x);//提示3
上面來回賦值的不過是兩個(gè)不同對象的屬性,都是互相孤立的,也都是基本數(shù)據(jù)類型,因此只是互相傳值,不會(huì)互相影響。
復(fù)制代碼 代碼如下:
var a=new Object();
a.x=5;
var b=a.x;
b=3;
alert(a.x);/提示/5
alert(b);//提示3
這也是一樣,b這個(gè)基本數(shù)據(jù)類型與a的基本數(shù)據(jù)類型的屬性x相互賦值,同樣不會(huì)互相影響,只是互相傳值。
可是,對象的屬性如果也是對象類型,那就也是傳址了。
復(fù)制代碼 代碼如下:
var a=new Object();
a.x=new Object;
a.x.n=5;
var b=a.x;
alert(b.n);//提示5
b.n=3;//也就改了a.x的n
alert(a.x.n);//提示3
alert(b.n);//提示3
a對象的屬性x,被定義為一個(gè)Object對象類型。因此b賦值為a.x時(shí),他們就是互通的了,其實(shí)就是同一個(gè)了,可以互相影響、改變。
————
可是,如果我想讓對象類型變量賦值時(shí),只是拷貝屬性,而不是達(dá)到“你就是我,我就是你”的境界、“同生共死”的高尚品格。怎么辦?
木有什么特別好的辦法,用下面這個(gè)函數(shù)吧。
復(fù)制代碼 代碼如下:
var DeepCopy = function(destination, source)
{
for (var property in source)
{
var copy = source[property];
if ( destination === copy ) continue;
if ( typeof copy === "object" )
{
destination[property] = DeepCopy(destination[property] || {}, copy);
}
else
{
destination[property] = copy;
}
}
return destination;
}
用法
復(fù)制代碼 代碼如下:
var a=new Object;
a.x=5;
a.y=3;
var b=new Object;
DeepCopy(b,a);
alert(b.x);//提示5
alert(b.y);//提示3
b.x=8;
alert(a.x);//提示5
看,修改了b.x卻不能影響a.x了吧?
這個(gè)DeepCopy是個(gè)不錯(cuò)的函數(shù)。
上面實(shí)現(xiàn)了對象類型的模擬“傳值”
那么怎么做才能模擬基本數(shù)據(jù)類型的“傳址”?
就是用Array對象。
復(fù)制代碼 代碼如下:
function change(a)
{
a[0]=5;
alert(a);//提示5
}
var x=[3];
alert(x);//提示3
change(x);
alert(x);//提示5
賦值為一個(gè)[xx],其實(shí)就是賦值為一個(gè)有數(shù)據(jù)的Array對象。這里就是利用含有一個(gè)元素的數(shù)組來模擬傳址。因?yàn)閿?shù)組是對象類型,傳遞時(shí)傳址。
當(dāng)然,你也可以用任意對象類型的屬性來模擬。
相關(guān)文章
Bootstrap Table實(shí)現(xiàn)定時(shí)刷新數(shù)據(jù)的方法
這篇文章主要介紹了Bootstrap Table實(shí)現(xiàn)定時(shí)刷新數(shù)據(jù)的方法,在這里小編比較推薦使用第二種方法,需要的朋友參考下吧2018-08-08js實(shí)現(xiàn)按鈕開關(guān)單機(jī)下拉菜單效果
這篇文章主要介紹了js實(shí)現(xiàn)按鈕開關(guān)單機(jī)下拉菜單效果,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11利用layer實(shí)現(xiàn)表單完美驗(yàn)證的方法
今天小編就為大家分享一篇利用layer實(shí)現(xiàn)表單完美驗(yàn)證的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS實(shí)現(xiàn)動(dòng)態(tài)修改table及合并單元格的方法示例
這篇文章主要介紹了JS實(shí)現(xiàn)動(dòng)態(tài)修改table及合并單元格的方法,結(jié)合完整實(shí)例形式分析了JS動(dòng)態(tài)遍歷及修改table單元格的具體操作技巧,需要的朋友可以參考下2017-02-02使用bootstrap-paginator.js 分頁來進(jìn)行ajax 異步分頁請求示例
本篇文章主要介紹了使用bootstrap-paginator.js 分頁來進(jìn)行ajax 異步分頁請求示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03TypeScript?使用?Tuple?Union?聲明函數(shù)重載
這篇文章主要介紹了TypeScript?使用?Tuple?Union?聲明函數(shù)重載,TypeScript 中為函數(shù)添加多個(gè)簽名后,依然需要添加相應(yīng)的代碼來判斷并從不同的簽名參數(shù)列表中獲取對應(yīng)的參數(shù),下文就來探索方法和技巧吧2022-04-04JS實(shí)現(xiàn)具備延時(shí)功能的滑動(dòng)門菜單效果
這篇文章主要介紹了JS實(shí)現(xiàn)具備延時(shí)功能的滑動(dòng)門菜單效果,涉及JavaScript基于鼠標(biāo)事件與時(shí)間函數(shù)實(shí)現(xiàn)頁面樣式延遲變換功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09