2011-08-23 70 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的克隆。

相关问题