Javascript对象如何能够引用它本身的值?

让我说我有以下的JavaScript:

var obj = { key1 : "it ", key2 : key1 + " works!" }; alert(obj.key2); 

这个错误与“key1未定义”。 我努力了

 this.key1 this[key1] obj.key1 obj[key1] this["key1"] obj["key1"] 

而且他们似乎从未被定义。

我如何获得key2来引用key1的值?

也许你可以考虑把属性去掉一个函数。 我的意思是这样的:

 var obj = { key1 : "it ", key2 : function() {return this.key1 + " works!";} }; alert(obj.key2()); 

这可以通过使用构造函数而不是文字来实现

 var o = new function() { this.foo = "it"; this.bar = this.foo + " works" } alert(o.bar) 

在初始化该对象之前,不能引用对象的属性; 使用外部variables。

 var key1 = "it"; var obj = { key1 : key1, key2 : key1 + " works!" }; 

另外,这不是一个“JSON对象”; 它是一个JavaScript对象。 JSON是一种用string表示对象的方法(这恰好是有效的Javascript代码)。

因为定义obj的语句还没有完成,所以key1还不存在。 考虑这个解决scheme:

 var obj = { key1: "it" }; obj.key2 = obj.key1 + ' ' + 'works!'; // obj.key2 is now 'it works!' 

另一种方法是使用getter / setter方法。

例如,如果您只关心读取计算值:

 var book = {} Object.defineProperties(book,{ key1: { value: "it", enumerable: true }, key2: { enumerable: true, get: function(){ return this.key1 + " works!"; } } }); console.log(book.key2); //prints "it works!" 

上面的代码,但是,不会让你定义key2的另一个值。

所以,如果你想重新定义key2的价值,情况会变得更加复杂。 它将始终是一个计算值。 最有可能的就是你想要的。

但是,如果您希望能够重新定义key2的值,那么您将需要一个地方来独立于计算而caching其值。

有点像这样:

 var book = { _key2: " works!" } Object.defineProperties(book,{ key1: { value: "it", enumerable: true}, _key2: { enumerable: false}, key2: { enumerable: true, get: function(){ return this.key1 + this._key2; }, set: function(newValue){ this._key2 = newValue; } } }); console.log(book.key2); //it works! book.key2 = " doesn't work!"; console.log(book.key2); //it doesn't work! for(var key in book){ //prints both key1 and key2, but not _key2 console.log(key + ":" + book[key]); } 

另一个有趣的select是使用一个自我初始化的对象:

 var obj = ({ x: "it", init: function(){ this.y = this.x + " works!"; return this; } }).init(); console.log(obj.y); //it works! 

这不是一个JSON对象,这是一个通过对象文字符号创build的Javascript对象。 (JSON是数据交换的文本符号 (更多) 。如果您正在处理JavaScript源代码,而不是处理string ,那么您不会处理JSON。)

在对象初始化器中没有办法引用被初始化的对象的另一个键,因为在初始化器完成之前没有办法获得对被创build对象的引用。 (没有关键字类似this或这种情况的东西。)

一旦你在函数内部,你也可以引用obj而不是this

 var obj = { key1: "it", key2: function(){return obj.key1 + " works!"} }; alert(obj.key2()); 

这不是JSON 。 JSON的devise很简单, 允许任意expression并不简单。

在完整的JavaScript,我不认为你可以直接做到这一点。 直到名为obj的对象完全构buildobj才能引用this 。 所以你需要一个解决方法,比我提供更多JavaScript-fu的人。