2011-08-23 69 views
1
function A(){} 
var B = {}; 

var a1 = new A(); 
var a2 = new A(); 
var b1 = B; 
var b2 = b1; 

A.prototype.prop = "A's Property"; 
b1.prop = "B's Property"; 
a1.prop = "Not Prop"; 
alert (a1.prop + " not equal to " + a2.prop); 
b2.prop = "Not Prop"; 
alert (b1.prop +" still equal to "+ b2.prop); 

正如你所看到的,b2.prop不能通過值傳遞,如何通過值傳遞而不更改屬性名稱?如何不通過引用傳遞一個值到同一個對象屬性?

+1

你能澄清你的 「按值傳遞」 的概念?因爲通常「傳遞」意味着將參數傳遞給函數。你沒有定義任何函數,所以這可能不是你的意思。 – zneak

回答

0

定義一個clone方法:

function clone(o) { 
    if(!o || 'object' !== typeof o) { 
     return o; 
    } 
    varc = 'function' === typeof o.pop ? [] : {}; 
    var p, v; 
    for (p in o) { 
     if (o.hasOwnProperty(p)) { 
      v = o[p]; 
      if (v && 'object' === typeof v) { 
       c[p] = clone(v); 
      } else { 
       c[p] = v; 
      } 
     } 
    } 
    return c; 
} 

,然後用它來克隆你的b1對象:

var b1 = B; 
var b2 = clone(b1); 
3

您是否問如何爲prop提供b1b2不同的值?因爲你這樣做的方式,你不能。 b1b2引用同一個對象。您將不得不爲每個對象創建一個新對象。

var b1 = {}; 
var b2 = {}; 
// b1 and b2 can have independent prop values now 
+0

是的,你能不能創建一個新的對象? – Kitty

+2

不,一個對象的單個實例一次只能有一個屬性的兩個值。 – lincolnk

+0

嗯...所以這就是爲什麼'原型'更強大,感謝傢伙 – Kitty

0

您分配b2b1這僅僅是B參考。

如果您希望它們具有不同的屬性包,則必須將b2分配給b1的克隆。

相關問題