如何按功能更改对象

时间:2015-07-02 23:21:33

标签: javascript

在一项任务中,我必须通过将对象传递给函数来更改对象。它几乎是这样的:

function change(obj) {
	return {
    fn1: function() {
        obj['three'] = 3;
    },   
    fn2: function() {      
        obj = {'four':4};      
    }
};
}

var obj = {'one':1,'two':2};
console.log(obj); // output 'Object {one=1, two=2}'
var temp = change(obj);
temp.fn1(); 
console.log(obj); //  output 'Object { one=1,  two=2,  three=3}'
temp.fn2();
console.log(obj); //  output 'Object { one=1,  two=2,  three=3}'

fn1用于更改对象的值之一。正如你所看到的,它打算将obj [3]设置为3并且效果很好。

fn2用于替换另一个对象。 obj在执行后应该只包含'4':4,但它不起作用。

然后我检查fn2里面的obj的值:

 ...
    fn2: function() {
      console.log('before fn2',obj);
      obj = {'four':4};
      console.log('after fn2', obj);
    }
};
...

输出结果为:

'before fn2 Object{one=1,two=2,three=3}'
'after fn2 Object{four=4}'

所以它确实在fn2中工作。当fn1工作时,我感到困惑fn2失败了。如何解决?

1 个答案:

答案 0 :(得分:2)

在JavaScript中,参数是按值传递的,尽管该值通常具有类似指针的语义。当您运行obj['three'] = 3;时,您不会重新绑定变量obj;您只是在更改obj当前持有的对象的属性。另一方面,当您重新分配obj时,您正在更改变量 obj,而不是变量用于保存的对象。您无法在JavaScript中实现所需的语义;您可以做的最好的事情是删除obj的所有属性,并复制您希望在其上的任何属性。