为变量赋新对象那点破事

作者:vkvi 来源:ITPOW(原创) 日期:2010-9-13

其实本文讨论的就是 JS 中没有按地址(引用)传递,只有按值传递一文讨论的,先看一个例子:

var c1 = {v:1};
var c2 = c1;
c2.v = 11;
c2 = {v:2};
alert(c1.v); // 显示 11
alert(c2.v); // 显示 2

其实这个例子好理解, c2 赋新对象,c1 仍旧是老对象。

这个似乎有点小儿科。

function c()
{
    var obj = {v:1};
    obj.func = function()
    {
        obj.v = 2;
    };
   
    return obj;
}
 
var c1 = c();
c1.func();
alert(c1.v); // 显示 2
 
var c2 = new c();
c2.func();
alert(c2.v); // 显示 2

由于 c 中使用了 return,所以 new 不 new 都一样,这里是直接操作的 obj 的属性,没有赋新对象,所以显示更改后的值 2。

function c()
{
    var obj = {v:1};
    obj.func = function()
    {
        obj = {v:2};
    };
   
    return obj;
}
 
var c1 = c();
c1.func();
alert(c1.v); // 显示 1
 
var c2 = new c();
c2.func();
alert(c2.v); // 显示 1

这里显示 1,是由于为 obj 赋了新对象,而 return 后形成的变量(c1、c2)与 obj 是两个变量,所以 return 后形成的变量仍旧是老对象。

function c()
{
    this.obj = {v:1};
    this.func = function()
    {
        this.obj = {v:2};
    };
}
 
/*
var c1 = c();
c1.func();
alert(c1.obj.v);
*/
 
var c2 = new c();
c2.func();
alert(c2.obj.v); // 显示 2

这里显示 2,是由于使用了 this。

相关文章