我在小提琴中写了一个简单的测试脚本:http://jsfiddle.net/resting/qfCue/
我要做的是将margin属性设置为2,让obj.foptions.labelMargin
和obj.marginClone
接受此值。
我知道可以直接在obj.foptions.labelMargin
和obj.marginClone
更改值。但这不允许我“改变一个地方,改变所有地方”。
相反,obj.foptions.labelMargin
和obj.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);
答案 0 :(得分: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);
关于marginClone,请回想一下JavaScript只对对象类型有引用语义 - 因此对于标量值,您将始终进行复制。如果希望将标量传递给对象,则可以将标量包装在对象中。