Вопрос об «этом» в JavaScript - PullRequest
2 голосов
/ 11 апреля 2011

Это может быть вопрос новичка.Я использовал javascript в течение многих лет, но только начал серьезно относиться к нему.У меня есть вопрос по поводу "this"

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

console.log('defaults',defaults);

Не уверен, почему defaults.baseName имеет значение "undefined". Как можно ссылаться на фигурные скобки?Возможно ли это, или мне действительно нужно дважды напечатать 'item_'?

Ответы [ 4 ]

3 голосов
/ 11 апреля 2011

Простой ответ: вы не можете делать то, что пытаетесь сделать.Во время синтаксического анализа / интерпретации / оценки (как бы вы ни думали об этом) литерала объекта он не существует, и поэтому на него нельзя ссылаться каким-либо образом.

2 голосов
/ 11 апреля 2011

Литерал объекта 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

Вы можете использовать методы получения и установки.

2 голосов
/ 11 апреля 2011

Вы можете сделать это:

var defaults = {};
defaults.baseId = defaults.baseName = 'item_';
1 голос
/ 11 апреля 2011

Вместо этого вы можете использовать function, создавая эквивалент class:

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

Теперь this будет иметь правильный контекст.

Другой вариант, используя ваш оригинальныйкод, делает baseName функцию:

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

Спасибо Шиме Видас за исправление!

...