2011-04-10 89 views
2

这可能是一个新手问题。我已经使用了JavaScript多年,但只是开始认真对待它。我有一个问题关于“本”关于JavaScript中“this”的问题

var defaults = { 
    baseId : 'item_', 
    baseName : this.baseId 
} 

console.log('defaults',defaults); 

不知道为什么defaults.baseName是“不确定”如何一个参考的东西,在大括号?是否有可能,还是我真的必须输入'item_'两次?

+1

我会建议你做一个'变种前缀=“item_''并用它来追加到你所映射的值,当你需要它 – 2011-04-10 20:31:46

+0

也看看http://www.quirksmode.org/js /this.html – 2011-04-11 05:48:02

回答

2

JavaScript对象字面是一个语法糖,因此它不工作。

this; // at point A 
var defaults = { 
    baseId : 'item_', 
    baseName : this.baseId 
} 

转化为

this; // point A 
var defaults = new Object(); 
defaults.baseId = 'item_'; 
defaults.baseName = this.baseId; // "this" here is same as "this" at point A 

您可以使用getter和setter。

{ 
    baseId: 'item_', 
    get baseName() { return this.baseId; }, 
    set baseName(x) { this.baseId = x } 
} 
1

您可以使用function而是创造class相当于:

function defaults() { 
    this.baseId = 'item_'; 
    this.baseName = this.baseId; 
} 

现在this将有适当的范围内。

另一种选择,使用原来的代码,正在baseName功能:

var defaults = { 
    baseId : 'item_', 
    baseName : function() { return this.baseId; } 
}; 

感谢SIME维达斯的修正!

+1

你不必写两次'defaults'。你可以这样写:'return this.baseId;' – 2011-04-10 20:47:56

3

简单的答案是,你不能做你想做的事情。在对象文本的解析/解释/评估过程中(不管你想要考虑它),它不存在,所以它不能以任何方式被引用。

2

你可以这样做:

var defaults = {}; 
defaults.baseId = defaults.baseName = 'item_';