JS類比物件導向全解(二、類型與賦值)

來源:互聯網
上載者:User

類型賦值類似變數傳遞的問題。
基礎資料型別 (Elementary Data Type)不必說,傳值的。 複製代碼 代碼如下: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

不過,物件類型的屬性互相賦值,就與物件類型沒關係了,就和其屬性的類型有關係。
屬性是基礎資料型別 (Elementary Data Type)則傳值,屬性是物件類型則傳址。舉個例子吧,簡單點: 複製代碼 代碼如下: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

上面來回賦值的不過是兩個不同對象的屬性,都是互相孤立的,也都是基礎資料型別 (Elementary Data Type),因此只是互相傳值,不會互相影響。 複製代碼 代碼如下:var a=new Object();
a.x=5;
var b=a.x;
b=3;
alert(a.x);/提示/5
alert(b);//提示3

這也是一樣,b這個基礎資料型別 (Elementary Data Type)與a的基礎資料型別 (Elementary Data Type)的屬性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是個不錯的函數。
上面實現了物件類型的類比“傳值”
那麼怎麼做才能類比基礎資料型別 (Elementary Data Type)的“傳址”?
就是用Array對象。 複製代碼 代碼如下:function change(a)
{
a[0]=5;
alert(a);//提示5
}
var x=[3];
alert(x);//提示3
change(x);
alert(x);//提示5

賦值為一個[xx],其實就是賦值為一個有資料的Array對象。這裡就是利用含有一個元素的數組來類比傳址。因為數組是物件類型,傳遞時傳址。
當然,你也可以用任意物件類型的屬性來類比。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.