在JavaScript中如何给变量赋引用?

4
我想在JavaScript中引用变量。
例如,我想做:
a=1
b=a
a=2

“and have b=2,并根据a做相应的更改。”
“这在Javascript中是否可能?如果不行,是否有一种方法可以像a.onchange = function() {b=a}这样做?”
“我想做的是创建一个函数,名为makeobject,它创建一个对象并将其放入数组中,然后返回该对象。”
function makeobject() {
   objects[objects.length] = {blah:'whatever',foo:8};
   }

所以我能做到
a=makeobject()
b=makeobject()
c=makeobject()

在代码后面执行
for (i in objects) {
   objects[i].blah = 'whatev';
}

同时也要改变a、b和c的值。
3个回答

5
您可以使用新的对象字面量语法来实现这一点,它在大多数浏览器中都很有效。
var o = {
    _a : null,
    get a() { return this._a; },
    set a(v) { this._a = v; },
    get b() { return this._a; },
    set b(v) { this._a = v; }
};

o.a = 2;
o.b = 3;
o.a = 4;
alert(o.b); // alerts 4

另一个选择是创建您自己的参考对象。
function Ref(obj, name, otherName) {
    this.obj = obj;
    this.name = name;
    this.otherName = otherName;
}

Ref.prototype.assign = function (v) {
    this.obj[this.name] = this.obj[this.otherName] = v;
}

var o = {
    a : 1,
    b : 4
};

var ref = new Ref(o, 'a', 'b');
ref.assign(3);

alert(o.b);

2

这是有可能的。但您需要使用一个对象:

var a = new Object();
a.val = 6;

alert(a.val);

var b = a;
b.val = 5;

alert(a.val);

编辑:尽管已有答案标记,但我正在尝试另一种替代方案,并提供另一个解决方案:

function makeobj()
{
    if(typeof makeobj.baseobj === 'undefined')
    {
        makeobj.baseobj = { 'blah': 'whatever', 'foo': 8 };
    }
    return makeobj.baseobj;
}

var a = makeobj();
var b = makeobj();
var c = makeobj();

alert(a['blah']);
alert(b['blah']);
alert(c['blah']);

b['blah'] = 'i changed the value';

alert(a['blah']);
alert(b['blah']);
alert(c['blah']);

替代方案允许您创建n个对象,并在需要时更改其值,使更改传播到由makeobj()函数创建的其他变量。


2
这是不正确的。在JS中,所有东西都是按值传递和赋值。抱歉我用大声说的方式表达 :-) 请注意,在上面的“按值传递”的语句中,没有提到“复制/克隆/重复”的问题。一个对象就是它本身,变量只是对象的短暂名称。但是,因为演示了对象可以被改变,所以给个赞,以得到与帖子所要求的类似效果。 - user166390
我需要更深入地研究ECMA规范(如果我能找到一个好的来源)。感谢让我对阅读枯燥的白皮书产生兴趣。+1 - Demian Brecht
1
@Demian - 哇,我实际上是想打出原因的... 无论如何,原因是在5版本之前,undefined变量是可变的,所以任何代码都可以更改它的值。 - ChaosPandion
我只想重申一下,所有的东西都是按值传递的。 - hvgotcodes
谢谢你再次强调这一点 :P 我已经删除了我帖子中的那部分。 - Demian Brecht
显示剩余3条评论

0

这是不可能的。

你想做什么?
我们可能可以找到更多使用JavaScript的方法来实现它。


有什么特别的原因导致这不可能吗?您能否稍微解释一下为什么会这样? - templatetypedef
1
因为在JavaScript中,赋值操作总是将一个“值副本”分配给一个“槽位”(变量或属性)?(在JS中,对象值始终代表它们自己。即使考虑Java术语,“对对象的引用”本身也只是值)。 - user166390
原因是我可以创建变量,并在同一时间更改所有的值。我将其添加到问题中。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接