Вопрос об "этом" в JavaScript

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

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

console.log('defaults',defaults);

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

4 ответа

Решение

Объектный литерал 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

Вы можете использовать геттеры и сеттеры.

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

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

Вы могли бы сделать это:

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

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

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

Сейчас this будет иметь соответствующий контекст.

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

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

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

Другие вопросы по тегам