0

我在小提琴中写了一个简单的测试脚本:http: //jsfiddle.net/resting/qfCue/

我想要做的是将 margin 属性设置为 2,并让obj.foptions.labelMarginobj.marginClone接受这个值。

obj.foptions.labelMargin我知道它有可能直接改变价值obj.marginClone。但这不允许我“改变一个地方,改变所有地方”。

相反,两者obj.foptions.labelMarginobj.marginClone都是undefined
我如何this.margin阅读为 2?

代码:

var obj= {
    margin: 10,
    setMargin: function(val) { this.margin = val; },
    foptions: { labelMargin: this.margin },
    marginClone: this.margin
}

obj.setMargin(2);
console.dir(obj.foptions);
console.log(obj.marginClone);
console.log(obj.margin);
4

1 回答 1

0

在 JavaScript 中执行此操作的典型方法是使用一个函数来创建一个保存状态的范围。以下是您的代码以这种风格重写的样子:

function obj()
{
    var that = this;

    that.margin = 10;
    that.setMargin = function(val) { 
        that.margin = val; 
    };
    that.foptions = { 
        labelMargin: that.margin 
    };
    that.marginClone = that.margin;
}

var inst = new obj();
inst.setMargin(2);
console.dir(inst.foptions);
console.log(inst.marginClone);
console.log(inst.margin);

在 JSFiddle 上查看

关于 marginClone,回想一下 JavaScript 仅对对象类型具有引用语义——因此对于标量值,您将始终进行复制。如果您希望它是按引用传递的,则可以将标量包装在对象中。

于 2013-08-08T16:58:46.420 回答