Javascript 如何引用JS对象定义中的字段?
好吧,这个问题可能表述得不好,但我会通过例子让它更清楚:Javascript 如何引用JS对象定义中的字段?,javascript,Javascript,好吧,这个问题可能表述得不好,但我会通过例子让它更清楚: var test = { x1 : 10, x2 : 20, x3 : x1 + 5, x4 : x2 + 5, } 我需要的是引用先前声明的“x1”或“x2”字段。但是,如果我像示例中那样写,JS说,“x1没有定义”。 我的第二次尝试是: var test = { x1 : 10,
var test = {
x1 : 10,
x2 : 20,
x3 : x1 + 5,
x4 : x2 + 5,
}
我需要的是引用先前声明的“x1”或“x2”字段。但是,如果我像示例中那样写,JS说,“x1没有定义”。我的第二次尝试是:
var test = {
x1 : 10,
x2 : 20,
x3 : this.x1 + 5,
x4 : this.x2 + 5,
}
但是“x3”和“x4”变成“NaN”,因为“this.x1”和“this.x2”是“未定义的”。我甚至试过:
var test = {
x1 : 10,
x2 : 20,
x3 : test.x1,
x4 : test.x2,
}
但得到“测试未定义”。
那么,我该如何引用“x1”或“x2”?另外,我知道,我可以写这样的东西:
var test2 = new (function(){
this.x1 = 10;
this.x2 = 20;
this.x3 = this.x1 + 5;
this.x4 = this.x2 + 5;
})();
它可以很好地工作,但我真的需要一个类似JSON的对象定义
更新:我忘了这个对象的描述叫做“文字”。因此,我找不到关于这个主题存在的问题。然而,现在我已经阅读了他们的类似问题和答案,但还没有找到解决我问题的答案。事实上,我需要保持文字符号,因为我正在开发一种“配置文件格式”,它必须具有声明性语法(当然还有这种格式的解析器,它将根据这个配置文件执行一些算法)。并且这个配置文件必须能够被不懂JS的人理解和编辑。对他们来说,它不是一个脚本或对象,而是一个具有指定结构的JSON。因此,我最终无法使用某些init函数。
即使是getter也会增加太多的复杂性。这听起来可能很有趣,但是是的,它太复杂了。它将添加关键字“get”和“return”,以及圆括号和分号标点符号。JSON语法只有两种括号和两种标点:冒号和逗号。因此,使用getter或函数时,复杂度几乎翻了一番,即使它们只包含一个字符串。
现在我倾向于选择,只是添加“id”字段,并由它引用。但也许有人能提供更好的解决方案
另外,我没有任何选择,除了使用一些有效的JS用于此配置文件,因为我的应用程序将没有任何服务器端。只有本地JS和HTML文件,并且只有标准浏览器可以运行它们,所以没有文件访问权限。因为配置文件将以JS文件的形式提供给应用程序。您应该这样做:
var test = {
x1 : 10,
x2 : 20,
x3 : function() {
return this.x1 + 5;
},
x4 : function() {
return this.x2 + 5;
},
}
alert(test.x3())
实现这一点的另一种方法(更多oop):
也许您使用了一种语法:
var测试={
x1:10,
x2:20,
get x3(){返回this.x1+5;},
get x4(){返回this.x2+5;}
}
文件编写(测试x3)代码>某些预处理的可能重复应该是必要的:一个可能的解决方案可能是一个字符串,其中包含要计算的值,如x3:'this.x1+5',
eval可以执行并分配结果。eval可能是问题的最差解决方案。为什么不在初始定义之后只执行test.x3=test.x1+5
。所以用户可以从另一个文本中引用在一个文本中定义的字段。它们不能引用任何可能的字段,但至少可以声明一些“库”,其中包含要重用的元素。这应该足够了。也许这比给他们权力去查阅所有资料更好。换句话说,它将使配置格式更加严格。示例:varbase={x1:10,x2:20};var检验={x1:base.x1,x2:base.x2,x3:base.x1+5,x4:base.x2+5,}有人不喜欢这个问题,我很可能完全同意。正如你所看到的,我也被否决了,至少你被重新投票了…:/不是我的反对票,但这不符合OP在问题中所描述的。getter根据其他值动态返回值,而不是初始化它。但是类似json的值是错误的。json没有功能。和是字符串。谢谢你们的回答。我不知道Getter的事。这似乎是一个相对较新的特性(我很久以前就研究过JS)。因为我使用canvas,所以旧浏览器不支持getter并不重要。在我的案例中,返回动态值不是问题。无论如何,此对象必须是常量。另一方面,我试图避免命令式JS语法(在getter中使用),而只使用JSON语法。对于算法的其余部分,它必须是一个类似“配置文件”的文件,而这个“文件”将由非js程序员编辑。也许程序员根本就不会。
var test = function() {
var self = this;
self.x1 = 10;
self.x2 = 20;
self.x3 = self.x1*2;
self.x4 = self.x2*2;
}
var toto = new test();
alert(toto.x3);