国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JS模擬面向對象全解(二、類型與賦值)

2019-11-20 23:45:43
字體:
來源:轉載
供稿:網友
類型賦值類似變量傳遞的問題。
基本數據類型不必說,傳值的。
復制代碼 代碼如下:

var a=5;
var b=a;
b=3;
alert(a);//提示5
alert(b);//提示3

由此觀之,發現改變b不會改變a,因為都是變量的值在來回傳遞,和變量本身沒有關系。
對象類型,傳址的。
復制代碼 代碼如下:

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,互相改變。
如若還不清楚,再舉個例子:
復制代碼 代碼如下:

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

不過,對象類型的屬性互相賦值,就與對象類型沒關系了,就和其屬性的類型有關系。
屬性是基本數據類型則傳值,屬性是對象類型則傳址。舉個例子吧,簡單點:
復制代碼 代碼如下:

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

上面來回賦值的不過是兩個不同對象的屬性,都是互相孤立的,也都是基本數據類型,因此只是互相傳值,不會互相影響。
復制代碼 代碼如下:

var a=new Object();
a.x=5;
var b=a.x;
b=3;
alert(a.x);/提示/5
alert(b);//提示3

這也是一樣,b這個基本數據類型與a的基本數據類型的屬性x相互賦值,同樣不會互相影響,只是互相傳值。
可是,對象的屬性如果也是對象類型,那就也是傳址了。
復制代碼 代碼如下:

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,被定義為一個Object對象類型。因此b賦值為a.x時,他們就是互通的了,其實就是同一個了,可以互相影響、改變。
――――
可是,如果我想讓對象類型變量賦值時,只是拷貝屬性,而不是達到“你就是我,我就是你”的境界、“同生共死”的高尚品格。怎么辦?
木有什么特別好的辦法,用下面這個函數吧。
復制代碼 代碼如下:

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了吧?
這個DeepCopy是個不錯的函數。
上面實現了對象類型的模擬“傳值”
那么怎么做才能模擬基本數據類型的“傳址”?
就是用Array對象。
復制代碼 代碼如下:

function change(a)
{
a[0]=5;
alert(a);//提示5
}
var x=[3];
alert(x);//提示3
change(x);
alert(x);//提示5

賦值為一個[xx],其實就是賦值為一個有數據的Array對象。這里就是利用含有一個元素的數組來模擬傳址。因為數組是對象類型,傳遞時傳址。
當然,你也可以用任意對象類型的屬性來模擬。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 达拉特旗| 汝城县| 保定市| 天水市| 白山市| 古丈县| 扶余县| 高州市| 池州市| 樟树市| 宣威市| 南川市| 慈利县| 巢湖市| 旺苍县| 辰溪县| 扶余县| 武城县| 广西| 衡南县| 平安县| 苏尼特左旗| 辽中县| 开平市| 永善县| 阳信县| 五河县| 肥西县| 当涂县| 连山| 万盛区| 隆昌县| 陇川县| 蕉岭县| 电白县| 巨鹿县| 温宿县| 馆陶县| 泊头市| 西青区| 棋牌|