关于“的问题”;这";在JavaScript中

关于“的问题”;这";在JavaScript中,javascript,object,scope,this,curly-braces,Javascript,Object,Scope,This,Curly Braces,这可能是个新手问题。我已经使用javascript好几年了,但才开始“认真”对待它。我有一个关于“这个”的问题 不知道为什么defaults.baseName是“未定义的”,一个如何引用花括号中的内容?是否可能,或者我真的必须键入两次“item”?您可以使用函数,创建与类等效的: function defaults() { this.baseId = 'item_'; this.baseName = this.baseId; } 现在,此将具有适当的上下文 使用原始代码的另一个选项

这可能是个新手问题。我已经使用javascript好几年了,但才开始“认真”对待它。我有一个关于“这个”的问题


不知道为什么defaults.baseName是“未定义的”,一个如何引用花括号中的内容?是否可能,或者我真的必须键入两次“item”?

您可以使用
函数
,创建与
等效的:

function defaults() {
   this.baseId = 'item_';
   this.baseName = this.baseId;
}
现在,
将具有适当的上下文

使用原始代码的另一个选项是使
baseName
成为函数:

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

感谢西蒙·维达斯的更正

简单的答案是你不能做你想做的事。在对象文本的解析/解释/评估(不管您怎么想)过程中,它不存在,因此不能以任何方式引用它。

您可以这样做:

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

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 }
}

我建议您使用
var prefix='item.'
,并在需要时将其附加到映射的值中,这样您就不必编写
defaults
两次。您可以编写:
返回this.baseId
{
   baseId: 'item_',
   get baseName() { return this.baseId; },
   set baseName(x) { this.baseId = x }
}