覆盖传递给函数的对象

时间:2013-06-08 11:23:21

标签: javascript object override

我最近想知道这是否可行:将一个对象传递给一个函数,并用该函数内部的一个完全不同的对象覆盖整个对象,以便永久修改它的值。由于对象是通过引用传递的,我觉得它必须以某种方式工作,但我不知道如何。要把它放在代码中,它应该做这样的事情:

function a() {
    console.log("i am a");
}

function b() {
    console.log("i am b");
}

function override(func1, func2) {
    func1 = func2;
}

override(a, b);

a(); //"i am b" expected

FIDDLE

这显然不起作用,因为我只是覆盖变量func1,但我认为你明白了。我选择使用函数而不是纯对象,因为您可以通过删除其属性并从第二个对象复制新属性来轻松“覆盖”对象。但那不是我想要的。

在你问之前,我并不想用这个来解决任何现实生活中的问题,我只是出于好奇而问。那么有没有办法实现这一目标,如果没有,是否有理由不这样做?

谢谢!

2 个答案:

答案 0 :(得分:3)

这不起作用,因为虽然JS传递对函数的引用,但这意味着您的func1func2参数最终引用标识符a的相同函数(对象)并b引用,但是当您更改func1引用的内容时,a不会影响{{1}}引用的内容。

换句话说,当您将对象传递给函数时,函数可以通过修改,添加或删除属性来更改对象的内容,但它不能更改函数外部的变量引用的对象。 (至少,不是通过函数自己的参数 - 函数可以修改其范围链中的变量,直到并包括全局变量,但它必须通过自己的名称引用它们来实现。)

答案 1 :(得分:0)

在您的代码中

function override(func1, func2) {
    func1 = func2;
}

func1是指向函数a的变量,func2是指向函数b的变量。声明func1 = func2使func1指向b。它不会更改函数override之外的任何内容。

请使用对象来使用通过引用传递。下面给出的代码说明了它的工作原理。

function a() {
    console.log("i am a");
}

function b() {
    console.log("i am b");
}

var object1 = {
   func1:a
};

var object2 = {
   func2:b
}


function override(object1, object2) {
    object1.func1 = object2.func2;
}

override(object1, object2);

object1.func1(); //"i am b"

此代码仅用于演示,可能在实际情况下无用。