2

Объясните, почему в таком коде как:

obj = {
    x: 10,
    y: this.x + 20
}

obj.x = 10, а obj.y = NaN. Хотя, если написать так:

obj = {
    x: 10,
    y: 20,
    foo: function() {return this.x + this.y}
}

obj.foo() = 30.

Как мне присвоить полю объекта другое поле этого же самого объекта?

Nofate
  • 34,603
0x1337
  • 467

2 Answers2

3

В первом случае this - это не obj, а во втором вы вызываете метод объекта obj

Касаемо первого случая, если данный фрагмент кода выполняется в глобальном контексте или в функции, то this == window (если это браузер конечно) или объект для которого вызывается метод если этот фрагмент находится в методе.

По поводу второго вопроса могу предложить следующее:

obj = {};
obj.x = 10;
obj.y = obj.x + 20;

Добавлено: Еще к первому фрагменту. Посмотрите что будет если

x = 15;
obj = {
    x: 10,
    y: this.x + 20
}
alert(obj.y);
tutankhamun
  • 11,366
0

Предпочтительное объявление, позволяющее манипулировать перечисляемостью и задавать get\set + ещё множество других свойств, которые можно легко отыскать в хелпе -

var object = {};

Object.defineProperties(object, {
    'x': {
        value: 10
    },
    'y': {
        value: 15
    },
    'foo': {
        value: function( ){
            return this.x + this.y;
        }
    }
});

console.log(object.foo( ) ); // 25
vas
  • 1,757
  • 1
  • 21
  • 43