Затык с объектом [как выразить значение объекта через значение в этом же объекте?]

Казалось бы, объекты знаю, обращения к свойствам тоже. И вот простая задачка - голову сломал. Подскажите, пожалуйста, как быть:

var x = 5;
var y = 5;

var accomodation = {
	"offer": {
		"address": [this['location']['x'], this['location']['y']]
    },

	"location": {
		"x": x,
		"y": y
	}
};

или 

var accomodation = {
	"offer": {
		"address": [accomodation['location']['x'], accomodation['location']['y']]
    },

	"location": {
		"x": x,
		"y": y
	}
};


Нужно, чтобы в address прописались значения x и y из location. Формат объекта - именно такой, как я написал: т.е. offer и location - это отдельные подобъекты объекта accomodation, их нельзя объядинять. Как ни извращался - получаю ошибку. В лучшем случае - address: [undefined, undefined], в худшем - что не может прочитать свойства от undefined. В чём проблема??

А почему не просто address: [x, y]?

Так требует преподаватель.

Ну в таком случае, это Ваша задача понять в чём суть ;)

Если бы я понял, я бы сюда вопрос не задавал. Но уже голову сломал. К сожалению, это задача - маленький этап другой большой, который заблокировался тем, что эту я решить не могу.

@Alessio18911, дорогой мой, вам сюда: https://bonsaiden.github.io/JavaScript-Garden/ru/

А в вашем случае, при резоле объекта this и ссылка на объект ещё не существует. Поэтому ошибочка будет. Делайте через конструктор и get, set если нужны поля, а так методы. Почитайте про this и как происходит вычисление и присвоение переменных при работе движка JS.

1 лайк

О, спасибо большое ) Т.е., если я все же хочу оставить свой вариант, то нужно создавать accomodation через new Object()?

Он не будет работать принципиально. Есть вариант через getter-ы и setter-ы добиться желаемого поведения. Но это будет необоснованно сложно, неожиданно для читающего (если речь идет о коде для работы в команде) и сложно реализовать для начинающего.

Если эта проблема - чать другой более важной, то забей на эту, реши главную задачу, а к этой части кода всегда можно вернутся.

Я бы реализовывал ситуацию “одни и те же значения location.x в accomodation.offer.address” как

var location = {
	x: 5,
	y: 5,
}
var accomodation = {
	offer: {
		address: [location.x, location.y]
	},
	location: location
}
1 лайк

Дмитрий, спасибо огромное!! Твои ответы очень понятны и проясняют ситуацию. Я понял теперь, как быть. Ещё раз спасибо! )

1 лайк

Привет!

Вот еще вариант с конструктором:

var x = 5;
var y = 5;

class Accomodation {
     offer = null;
     location = null;
   
     constructor(x,y) {
        this.offer = {
            address: [x,y]
        };

        this.location =  {
	       x: x,
	       y: y
        }
    }
}

var acc = new Accomodation(x,y);

Аааа… Вот оно когда this можно! Спасибо, что поделились :) Учту на будущее )